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

在不知道您的模型postscomments模型是什么样子的情况下,很难找出问题所在,但我将如何解决您的问题:

# 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 回答