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を編集
<コメント一覧>