あっくんブログ Written by Akihiro Tsuji

Ruby on Rails「ツイートにコメントを投稿しよう」

プログラミング

「Ruby on Railsツイートにコメントを投稿しよう」

    1 commentモデル作成
    2 アソシエーション定義
    3 ルーティングにcreateアクション
    4 コントローラーにcomments作成
    5 コントローラーにcreateアクション定義
    6 ビューにコメント投稿フォームを投稿詳細に追加
    7 コメント表示欄を投稿詳細に追加

1commentモデル作成

コメントモデルつくって、マイグレーション編集,実行
rails g model comment

t.integer :user_id
t.integer :tweet_id
t.text :text

rails db:migrate

2アソシエーション定義

comment.rbを編集 tweetsテーブルとusersテーブルとアソシエーション

belongs_to :tweet
belongs_to :user

tweet.rbを編集 commentsテーブルとアソシーション

has_many :comments

user.rbを編集 commentsテーブルとアソシエーション

has_many :comments

3ルーティングにcreateアクション

ルーティングのネストはルーティングに別のコントローラーのルーティングを記述する

routes.rbを編集 do とendで挟んで、ネストする

resources :tweets do
resources :comments, only: :create
end

ルーティングの確認で/tweets/:tweet_id/comments(.:format)

4コントローラーにcomments作成

rails g controller comments

5コントローラーにcreateアクション定義

comments_controller.rbを編集

def create
Comment.create(comment_params)
end

private
def comment_params
params.require(:comment).permit(:text).merge(user_id: current_user.id, tweet_id: params[:tweet_id])
end

comments_controller.rbを編集 createアクションの中にリダイレクト

comment = Comment.create(comment_params)
redirect_to "/tweets/#{comment.tweet.id}"

6ビューコメント投稿フォームを投稿詳細に追加

show.html.erbを編集

<% if user_signed_in? %>
<%= form_with(model: [@tweet, @comment], local: true) do |form| %>
<%= form.text_area :text, placeholder: "コメントする", rows: "2" %>
<%= form.submit "SEND" %>
<% end %>
<% else %>
<strong><p>※※※ コメントの投稿には新規登録/ログインが必要です ※※※</p></strong>
<% end %>
</div>

7コメント表示欄を投稿詳細に追加

tweets_controller.rbを編集

@comment = Comment.new
@comments = @tweet.comments.includes(:user)

show.html.erbを編集

<コメント一覧>

<% @comments.each do |comment| %>

<%= link_to comment.user.nickname, "/users/#{comment.user_id}" %>:
<%= comment.text %>

<% end %>