0

ユーザーが 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 を返すためだと思います。

これをどのように回避しますか?

4

3 に答える 3

3

コメントの検証が失敗した場合、comment.authorが設定されていない可能性があるため、nilになります。これはnil.nameエラーを説明しています。

あなたは次のようなことを試すことができます

@post.comments.each do |comment|
   p = comment.author.try(:name)

また

@post.comments.each do |comment|
  unless comment.new_record?
    p = comment.author.try(:name)
  end
end

また

@post.comments.reject{|c| c.new_record?}.each do |comment|
  p = comment.author.try(:name)
end
于 2012-10-19T08:53:09.970 に答える
1

変化する

if @post.comments.any?

if @post.comments.blank?

もう一度確認してください。

于 2012-10-19T08:44:53.583 に答える
0

postsモデルとモデルがどのように見えるかを知らなければcomments、問題を特定するのは少し難しいですが、問題を解決する方法は次のとおりです。

# app/models/post.rb
has_many :comments

# app/models/comment.rb
belongs_to :post

# app/controllers/posts_controller.rb
def show
  @post = Post.find params[:id]
end

# app/controllers/comments_controller.rb
def create
  # No need to instantiate the post and build the comment on it here since
  # we're going to set the post_id on the comment form.

  @comment = Comment.new params[:comment]
  if @comment.save
    # ...
  else
    # ...
  end
end

# app/views/posts/show.html.slim
- if @post.comments.any?
  @post.comments.each do |comment|
    # ...

- form_for Comment.new do |f|
  = f.text_field :author
  = f.text_field :body
  # ...
  = f.hidden_field :post_id, @post.id # This passes the comment's related post_id on to the controller.
  = f.submit

Slim セクションが構文的に正しいかどうかはわかりません。テンプレート エンジンはまだ使用していません。

これは本番環境で安全なコードではないことに注意してください! 例を短く (できれば) 要点を伝えるために、多くの形式を省略しました。

于 2012-10-19T05:34:40.537 に答える