ユーザーが Posts#show テンプレートからコメントを投稿できる典型的なブログ アプリがあります。
resources :posts do
resources :comments
end
# posts_controller.rb
def show
@post = Post.find(params[:id])
@comment = @post.comments.build
end
# comments_controller.rb
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
@comment.author = current_user
if @comment.save
redirect_to @post
else
render 'posts/show'
end
end
ビューでは、最初にコメントがあるかどうかを確認して出力し、次に新しいコメント フォームを表示しています。
/ posts/show.html.slim
- if @post.comments.any?
@post.comments.each do |comment|
p = comment.author.name
...
= form_for [@post, @comment]
コメントの検証に失敗すると、「nil クラスのメソッド名がありません」というエラーが表示されます。@post.commets.any?
これは、コメントが検証に失敗して保存されなかったにもかかわらず、投稿の関連付けを通じてコメントが作成されたため、true を返すためだと思います。
これをどのように回避しますか?