質問: @post.category #今回の質問では関係ないです end ``` ▶︎commentsファイルの_comment.html.erb ``` 名前:<%= comment.commenter %> <%= comment.created_at.strftime("%y/%m/%d(#{%w(日 月 火 水 木 金 土)[comment.created_at.wday]}) %H:%M:%S") %> <%= simple_format comment.body %> ``` ▶︎postsファイルのshow.html.erbのコメント投稿フォームとコメント一覧renderコードを入れ替えれた時に表示されるエラー ``` NoMethodError in Posts#show Showing ..app/views/comments/_comment.html.erb where line #2 raised: #以下の二行目が該当エラー部分と表示される 名前:<%= comment.commenter %> <%= comment.created_at.strftime("%y/%m/%d(#{%w(日 月 火 水 木 金 土)[comment.created_at.wday]}) %H:%M:%S") %> ID: <%= highlight(Digest::MD5.hexdigest("request.remote_ip.to_s + #{comment.created_at.strftime("%Y%m%d")} + #{@post.id}")[0,8], Digest::MD5.hexdigest("request.remote_ip.to_s + #{@post.created_at.strftime("%Y%m%d")} + #{@post.id}")[0,8]) %> <%= simple_format comment.body %> ```
回答: rails難しいですよね こう修正すればいいと思います。 ``` def show @post = Post.find(params[:id]) @category = @post.category #今回の質問では関係ないです @comment=@post.comments.new() end ``` ``` コメントを追加 <%= render "comments/form" ,locals: {comment: @comment} %> <%= render @post.comments %> ``` railsはひたすら空気を読んでくれる上に かなり深いところまで独自変更の可能な 至れり尽くせりフレームワークですが そのぶん何が省略されているかを見落とすと ずっと悩むことになります。 例えば ``` <%= render @post.comments %> ``` は ``` <%= render partial: 'comments',collections: @post.comments %> ``` の省略であり、つまり ``` <%= @post.comments.each do |comment|> <%= render partial: 'comments',locals: {comment: comment} %> <% end %> ``` ということであり 結局 ``` <%= @post.comments.each do |comment|> 名前:<%= comment.commenter %> <%= comment.created_at.strftime("%y/%m/%d(#{%w(日 月 火 水 木 金 土)[comment.created_at.wday]}) %H:%M:%S") %> <%= simple_format comment.body %> <% end %> ``` という風になっていることがわからないと なぜ、 ``` <%= render @post.comments %> <%= render "comments/form" %> ``` だとOKで逆がダメかはわかりませんよね ※そもそも元のコードもformに表示されているのは 登録された最後のレコードなので間違ってはいるのですが 最後になりましたが、railsは字のごとくレールに乗っている限り 必要な処理を全てやってくれます。 しかもレールから少しずれても脱線しないようフォローできます。 しかし、よくわからない状態でレールから抜けようとすると脱線します。 railsは初心者でもすぐ動くものが作れますが あくまで最初から奥義を授かっているような状況ということに注意して コードの意味何が省略されているかを考えてください