アプリケーション作成１

###アプリケーション作成
- 投稿一覧と投稿内容
- 投稿削除
- コメント機能
- 検索機能

```ruby:db/migrate/xxxx_create_posts.rb

mkdir app
cd app
---------------
db/migrate/xxxx_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.text :message
+     t.string :image
      t.integer :user_id
      t.timestamps
    end
  end
end
```

投稿を行えるように画像ファイル名を保存するフィールドを追加した。
t.string :image

```ruby:

rails db:migrate:reset

```
rails db:migrate:resetを実行するとマイグレーションを再実行できる

```ruby:app/views/postsnew.html.erb

<% content_for :title do %>
メッセージ作成
<% end %>

<%= render 'layouts/error_message', object: @post %>
<div class="row">
  <div class="col-md-8 col-md-offset-2">
    <h1>メッセージ作成</h1>
    <form action="<%= posts_path %>" method="post" enctype="multipart/form-data">
+     <div class="form-group">
+       <label for="Message">メッセージ</label>
+       <textarea class="form-control" name="message" id="Message" rows="5" placeholder="Your Post"></textarea>
+      </div>
      <div class="form-group">
        <label for="ImageFile">画像ファイル</label>
        <input type="file" name="file" id="ImageFile">
      </div>
      <button type="submit" class="btn btn-primary">送信</button>
      <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    </form>
  </div>
</div>

```
メッセージ作成画面に投稿する画像ファイルを設定する箇所を追加します。

```ruby:app/controllers/posts_controller.rb

class PostsController < ApplicationController
  before_action :logged_in_user

  def index
    if params[:word].present?
      @posts = Post.where("message like ?", "%#{params[:word]}%").order(created_at: :desc)
    else
      @posts = Post.all.order(created_at: :desc)
    end
  end

  def show
    @post = Post.find(params[:id])
  end

  def new
    # necessary for validation error message
    @post = Post.new
  end

  def create
    @post = Post.new
    @post.message = params[:message]
    @post.user_id = current_user.id

    if params[:file].present?
      image_file = params[:file]
      time = Time.now
      name = time.to_s + image_file.original_filename

      File.open("#{Rails.public_path}/images/#{name}", 'wb') { |f|
        f.write(image_file.read)
      }
      @post.image = name
    else
      @post.image = "no image"
    end

    if @post.save
      redirect_to posts_path
    else
      render 'new'
    end
  end

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    redirect_to posts_path
  end
end

```
app/controllers/posts_controller.rbのcreateを変更。createアクションにアップロードされた画像ファイルをサーバーのimageフォルダに置く処理とデータベースにファイル名を登録する処理を追加します。

```ruby:app/views/posts/index.html.erb

<% content_for :title do %>
投稿一覧
<% end %>

<div class="row">
  <div class="col-md-8 col-md-offset-2 col-xs-10 col-xs-offset-1">

    <div class="row">
      <div class="col-xs-6">
        <h2>投稿一覧</h2>
      </div>
      <div class="col-xs-6">
        <a href="<%= new_post_path %>" class="btn btn-primary btn-space-20 pull-right">新しい投稿</a>
      </div>
    </div>

    <% @posts.each do |post| %>
<div class="row well">
```




app/views/posts/index.html.erbのコードを変更。index.html.erbの
「div class="row well"」の部分が投稿の数分表示される。





```ruby:app/views/posts/index.html.erb

 <div class="row well">
      <div class="col-xs-9">
        <div class="media">
          <div class="media-left">
            <a href="#">
              <img class="media-object img-circle" src="<%= "/images/#{post.user.image}" %>" width=64 height=64>
            </a>
          </div>
          <div class="media-body">
            <h5 class="media-heading"><%= post.user.name %>　<small><%= post.created_at %></small></h5>
            <p><%= post.message %></p>
          </div>
        </div>
      </div>
      <div class="col-xs-3">
        <a href="<%= post_path(:id => post.id)%>" class="btn btn-info btn-xs pull-right">表示</a>

        <% if post.user.name == current_user.name %>
        <form action="<%= post_path(:id => post.id) %>" method="post">
          <input name="_method" type="hidden" value="DELETE">
          <button type="submit" class="btn btn-danger btn-xs pull-right">削除</button>
          <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
        </form>
        <% end %>

      </div>
    </div>
    <% end %>

  </div>
</div>
```

PostとUserはリレーションを持っているので、post.user.nameのような参照ができます。
ログインしたユーザーと投稿メッセージを作成したユーザーが同じ場合のみ削除ボタンが表示されるような処理。