Rails 5强参数,在复选框值内有一个数组

时间:2016-07-18 17:22:03

标签: ruby-on-rails checkbox strong-parameters

考虑到这些参数:

"product"=><ActionController::Parameters {"id"=>"",
"category_ids"=><ActionController::Parameters {"2"=>"1", "3"=>"1", "4"=>"1"} ,
"name"=>"...", "description"=>"a good prod", "size"=>"2x3m", "price"=>"23$", "url_video"=>"http://...", "remarks"=>"bla"} 

我想要使用正确的 category_ids 参数{“2”=&gt;“1”,“3”=&gt;“1”,“4”=&gt;“1”} permitrequire sintax,比我不知道:

执行时

params.require(:product).permit(:name, :size,..., category_ids: [] )

结果是

Unpermitted parameters: id, category_ids

我尝试了params.require(:product).permit(:category_ids[:id,:val]) ...和其他变体

什么是正确的sintax?

PD:这些参数是例如:

的结果
<input type="checkbox" name="product[category_ids][2]" id="product_category_ids_2" value="1">
<input type="checkbox" name="product[category_ids][3]" id="product_category_ids_3" value="1">

表示has_and_belongs_to_many关系

class Product < ActiveRecord::Base
  has_many :images, dependent: :destroy
  has_and_belongs_to_many :categories, autosave: true

  attr_accessor :category_list

end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products

  before_destroy :check_products
end

非常感谢!

经过更多调查,我发现了这篇文章:

Has Many Through Checkboxes in Rails 3.x, 4.x and 5

解释有关此问题的优秀方面,并且针对Rails 5,进一步说明了attr_accessor不是必需的

2 个答案:

答案 0 :(得分:5)

我不完全确定,但我认为您应该将复选框更改为:

<input type="checkbox" name="product[category_ids][]" id="product_category_ids_2" value="2">
<input type="checkbox" name="product[category_ids][]" id="product_category_ids_3" value="3">

然后在controller#product_params

params.require(:product).permit(:id, category_ids: [])

答案 1 :(得分:0)

基本上没有允许哈希的语法。我通常杜有这样的方法ApplicationController

def nested_params_keys(key, nested_key)
  (params[key].try(:fetch, nested_key, {}) || {}).keys
end

然后在其他控制器中我允许了参数

params.require(:product).permit(
  :name,
  category_ids: nested_params_keys(:product, :category_ids)
)