59

我的模型中有一个数组字段,我正在尝试更新它。

我的强参数方法如下

def post_params
  params["post"]["categories"] = params["post"]["categories"].split(",")

  params.require(:post).permit(:name, :email, :categories)
end

我在控制器中的操作如下

def update
  post = Post.find(params[:id]

  if post and post.update_attributes(post_params)
    redirect_to root_url
  else
    redirect_to posts_url
  end
end

但是,每当我提交更新帖子时,我都会在我的开发日志中看到

Unpermitted parameters: categories

传入的参数是

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"auth token", "id"=>"10", 

"post"=>{"name"=>"Toni Mitchell", "email"=>"eileen_hansen@hayetokes.info", "categories"=>",2"}}

我想认为这与属性categories是一个数组这一事实有关,因为其他一切看起来都很好。再说一次,我可能是错的。那么,我的代码有什么问题,为什么在明确允许的情况下不让我保存类别字段?谢谢。

4

6 回答 6

147

试试这个

params.require(:post).permit(:name, :email, :categories => [])

(无视我的评论,我认为这不重要)

于 2013-07-25T21:45:00.773 回答
44

在rails 4中,那将是,

params.require(:post).permit(:name, :email, {:categories => []})
于 2013-10-03T04:24:34.470 回答
10

允许的标量类型是String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO,ActionDispatch::Http::UploadedFileRack::Test::UploadedFile.

要声明 params 中的值必须是允许的标量值数组,请将键映射到一个空数组:

params.permit(:id => [])

这是Github 上强大的参数文档所说的:

params.require(:post).permit(:name, :email, :categories => [])

我希望这对你有用。

于 2013-07-25T21:53:46.600 回答
3

我有同样的问题,但简单地添加数组来允许是不够的。我也必须添加类型。这边走:

params.require(:transaction).permit(:name, :tag_ids => [:id])

我不确定这是否是完美的解决方案,但在那之后,“未经许可的参数”日志消失了。

我从这篇出色的帖子中找到了该解决方案的提示:http: //patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters

于 2015-07-18T08:36:26.983 回答
1

我遇到了同样的问题,但就我而言,我还必须从以下位置进行更改:

<input type="checkbox" name="photographer[attending]" value="Baku">

到:

<input type="checkbox" name="photographer[attending][]" value="Baku">

希望这对某人有所帮助。

于 2015-04-16T18:24:43.030 回答
1

如果像这样的参数中有多个项目和 item_array -

Parameters {"item_1"=>"value 1", "item_2"=> {"key_1"=> "value A1", 
"key_2"=>["val B2", "val C3"]} }

我们里面有数组item_2
可以允许如下-

params.permit(item_2: [:key_1, :key_2 => [] ])

以上拯救了我的一天,可能对你也有帮助。

于 2021-10-21T11:13:18.060 回答