ruby on rails でコメントの実装をする 「備忘録」
コメントモデルの作成
まずはコメントモデルを作る。
名前と型は次の通り
名前:型
user_id :integer
topic_id :integer
body :integer
次にモデルの関連付けをしていく。
- コメントは一つのトピックを持っている。
- コメントは一人のユーザーを持っている。
- トピックは複数のコメントを持っている。
つまり
「topicモデル」に「has_many : comment」を、「commentモデル」に「belongs_to : user」を追加していく。
*コメントとトピックの関連付けはすでに終えている。
コントローラーとルーターの設定
mvcモデルに乗っ取って行うので。まず先にルーターの設定から行っていく。
今回はresourseを使ってネストにしていく。
つまり、
config/routes
resources :topics do
resources :comments
end
としていく。
次にコントローラーの設定をしていく。
class CommentsController<ApplicationController
def new
@comment = Comment.new
end
def create
@comment = Comment.new(comment_params)
@comment.user_id = current_user.id
@comment.topic = params[:topic_id]
if @comment.save
redirect_to topic_path, success: '投稿に成功しました'
else
flash.now[:danger] = '投稿に失敗しました'
render : new
end
end
praivate
def comment_params
params.require(:comment).permit(:body)
end
end
これでコントロラーの設定ができた。
それぞれの設定の意図を説明していく。
1 , def new
→アドレス/new(ここではコメントのマークを押す)にアクセスされた時にコントローラー側でnewアクションが実行されるようにする。
2 , Comment.new
→コメントモデルのインスタンスが作られる。←これによってコメントのモデルの中にある各カラムが格納されるようになる。
3 , @coment = Comment.new
→2で作ったインスタンスを@comment変数とする。@をつけなければいけない理由はview側でもこのnewを使いたいから。
これによってview側でも@を使うことができる。
次に、
def createについて 説明していく。
@comment = Comment.new(comment_params)はnewメソッドを実行した時に送られてくる値を受け取るもの。これがないとデータが受け渡されない。
次に
@comment.topic = params[:topic.id]についてだが、これは送信されたurlに含まれた値を受け取っている。つまり、トピックのidを受けっとっている。だから、これでどのトピックかがわかる。
viewの設定
<div class="comment-new-wrapper" >
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="text-center">コメントをする</h1>
<%= form_for @comment, url:topic_comments_path do |f| %>
<div class="form-group">
<%= f.text_field :body, class: 'form-control' %>
</div>
<%= f.submit '投稿', class: 'btn btn-black btn-block' %>
<% end %>
</div>
</div>
</div>
</div>
ちょっとわかりづらいが備忘録なのでその辺は気にしない。
きになるのは
<%= form_for @comment, url:topic_comments_path do |f| %>
この部分。なんで直接urlを指定するの?とすごい疑問に思った。
いろいろ調べるとrailsでは複数形のパスしか作ってくれないということがわかった。
つまり俺が指定したいパス(正解のパス)がtopic_comments_pathで
railsが自動で作ってくれるパスがtopics_comments_pathらしい。だからエラーになってしまう。
このエラーで何時間戦ったことか。。。
まあ後はちょろかったからかかなくていいかな。
もしこの記事を見て間違ってるぞこのクソボケが!って方がいたらぜひ僕のツイッターに申し出てほしい。
こんなに偉そうに書いてるけど僕はrailsを初めて3週間なのでそこんとこよろしく!