2016-07-18 14 views
1

Vor dem Hintergrund dieser params:Rails 5 starke params mit einem Array innerhalb Kontrollkästchen Werte

"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"} 

I Category_ids params { "2" => "1", "3" => "Cath wollen 1 “, "4"=> "1"} mit dem richtigen permit und require sintax, als ich weiß nicht:

wenn

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

das Ergebnis ist

Unpermitted parameters: id, category_ids 

Ich habe params.require(:product).permit(:category_ids[:id,:val]) versucht ... und andere Varianten

was ist die richtige sintax?

PD: Diese params sind das Ergebnis, zum Beispiel:

<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"> 

für eine has_and_belongs_to_many Beziehung

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 

Vielen Dank!


Nach mehr Untersuchungen, fand ich diesen Artikel:

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

Erklärt den guten maners zu diesem Problem und ist für Rails 5, ferner erklärt, wie attr_accessor nicht notwendig ist,

+0

Können Sie Ihre Produkt- und Kategoriemodelle posten? – oreoluwa

+0

Sicher! Ich bearbeite die Frage –

Antwort

2

Ich bin mir nicht ganz sicher, aber ich glaube, Sie Ihre Kontrollkästchen aussehen ändern sollte wie dies:

<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"> 

Dann in Ihrem controller#product_params:

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

Ja! Sie können jetzt sicher sein, das ist die Lösung, Danke –

0

Grundsätzlich gibt es keine Syntax, um Hash zu erlauben. Was ich in der Regel du ist ein solches Verfahren mit Application

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

Und dann in anderen Controllern Ich habe erlaubt params

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