Rails 4数组未允许的参数

jas*_*328 52 ruby ruby-on-rails strong-parameters ruby-on-rails-4

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

我的强参数方法如下

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

  params.require(:post).permit(:name, :email, :categories)
end
Run Code Online (Sandbox Code Playgroud)

我在控制器中的动作如下

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
Run Code Online (Sandbox Code Playgroud)

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

Unpermitted parameters: categories
Run Code Online (Sandbox Code Playgroud)

传递的参数是

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

"post"=>{"name"=>"Toni Mitchell", "email"=>"eileen_hansen@hayetokes.info", "categories"=>",2"}}
Run Code Online (Sandbox Code Playgroud)

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

Sli*_*pan 133

试试这个

params.require(:post).permit(:name, :email, :categories => [])
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴也能解释为什么这会起作用@slicedpan (4认同)

小智 42

在轨道4中,那将是,

params.require(:post).permit(:name, :email, {:categories => []})
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但是如果我们已经在模型中定义了该属性的序列化,为什么它需要在一个单独的哈希中呢? (5认同)

Moh*_*usa 8

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

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

params.permit(:id => [])
Run Code Online (Sandbox Code Playgroud)

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

params.require(:post).permit(:name, :email, :categories => [])
Run Code Online (Sandbox Code Playgroud)

我希望这对你有用.