我遇到了我见过的最奇怪的错误,请考虑以下创建方法:
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"
视为一个字符串的方法?不确定....
答案 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"/>