强参数和嵌套参数 - Rails 4

时间:2014-02-11 20:54:32

标签: ruby-on-rails ruby ruby-on-rails-4

使用 form_for([@ post,@ comment])向评论控制台发送帖子请求时收到错误。要创建评论。

ActiveModel::ForbiddenAttributesError in CommentsController#create

导致错误的行:

@comment = @post.comments.build(params[:comment])

我知道这是一个强大的参数问题,但我似乎无法做到正确。目前我的帖子模型是:

posts.rb

class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
end

评论:

comment.rb

class Comment < ActiveRecord::Base
  belongs_to :post
end

我当前为评论控制器设置的强参数是:

comments_controller.rb

  private

    def comment_params
      params.require(:post).permit(comment: [:name, :body])
    end

最后,错误消息报告的参数是:

{"utf8"=>"✓",
 "authenticity_token"=>"MSX1PrrvfzYBr/DNYaMgSw3opWmaJs82xd11JfLPIqI=",
 "comment"=>{"name"=>"",
 "body"=>""},
 "commit"=>"Create Comment",
 "post_id"=>"1"}

任何人都有任何想法,我的强大的params设置被打破 - 任何想法将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

在你的控制器中,你需要你的帖子,而不是你的评论。也许试试:

def comment_params
  params.require(:comment).permit(:name, :body)
end

然后做:

@comment = @post.comments.build(comment_params)

看看是否有帮助。

答案 1 :(得分:1)

有几个问题......

一个问题是您没有在comment_params方法中使用build ...

@comment = @post.comments.build(params[:comment])

应该是

@comment = @post.comments.build(comment_params[:comment])

但我们还有另一个问题,即您发送的params实际上不是{post: {comment: 'stuff here'}}方法所指示的comment_params。它实际上是{comment: 'stuff here'}

所以你应该改变评论参数:

def comment_params
  params.require(:comment).permit(:name, :body)
end

然后建立你的评论:

@comment = @post.comments.build(comment_params)