未定义的方法? Rails中的控制器参数4

时间:2014-06-19 04:49:13

标签: ruby-on-rails

我遇到了我见过的最奇怪的错误,请考虑以下创建方法:

  def create
   post = Post.find_by(id: params[:post_id])
   @comment = Comment.new(comment_create_params)
   @comment.post_id = post.id #I know this line is useless I have yet to refactor.
   controller_save(@comment)
  end

从这里我们有comment_create params这是一个私有方法,但定义如下:

  def comment_create_params
    params.require(:comment).permit(:author, :comment, :parent_id)
  end

现在考虑传入的以下params

params => {"author"=>"157685iyutrewe1wq",
 "comment"=>"14253647turyerwe",
 "action"=>"create",
 "controller"=>"api/v1/comments",
 "post_id"=>"126"}

基于此,一切看起来都是正确的。运行此功能一切都应该保存。直到我收到以下错误:

NoMethodError: undefined method `permit' for "14253647turyerwe":String

我不知道这意味着什么 - 我认为它试图将"14253647turyerwe"视为一个字符串的方法?不确定....

3 个答案:

答案 0 :(得分:1)

<强> PARAMS

params.require(:comment).permit(:author, :comment, :parent_id)

这基本上会寻找一个继承自comment密钥的哈希,如下所示:

{"comment" => 
   {
     "id" => "5", 
     "name" => "test" 
   }
}

因此,当您使用require方法时,您基本上会说&#34;我们需要这个顶级哈希键&#34;,然后Rails将进入嵌套哈希&amp ;;使用permit方法查找其他属性,如上所示。

你遇到的问题是:

params => {"author"=>"157685iyutrewe1wq",
 "comment"=>"14253647turyerwe",
 "action"=>"create",
 "controller"=>"api/v1/comments",
 "post_id"=>"126"}

此处的问题是您在require键上调用comment;这只是一个字符串。要解决这个问题,您需要执行以下操作:

def comment_params
    params.permit(:author, :comment, :action)
end 

-

保存

您需要考虑的其他事项是controller_save方法。我以前从未见过这个,反对惯例。这不是问题,但意味着如果您的应用程序上有团队成员,或者想要升级Rails,那么适应它将是一件痛苦的事。

我肯定会使用标准的.save method,如下所示:

#app/controllers/comments_controller.rb
def create
   ...
   @comment.save
end

答案 1 :(得分:0)

实际问题是Comment模型中的属性也是comment,在将其更改(以及迁移脚本和测试)到comment_text时,一切都再次起作用:D

答案 2 :(得分:-1)

你的&#39; params&#39;绝对不是由铁轨组成的。的form_for。因为它看起来像params: { comment: { "author"=>"157685iyutrewe1wq", "post_id" => "some_id" } }
所以你的params.require(:comment)返回&#39; String&#39;具有值的对象=&#34; 14253647turyerwe&#34;它真的没有任何许可证#39;方法

因此,我建议您阅读rails中的forms,将表单数据发送到服务器时构建的html参数

<强>更新
如果由于某种原因你没有心情使用form_for @model帮助器,那么生成表单的任何方法都应该为该模型的每个字段生成如下的html:

<input id="comment_author" name="comment[author]" type="text" value="14253647turyerwe"/>

对于他们来说,我怀疑你有类似的东西:

<input id="author" name="author" type="text" value="14253647turyerwe"/>