29

Ich habe Probleme, eine has_many: through-Assoziation zu bekommen, die mit den starken Parametern von Rails 4 arbeitet. Ich habe ein Modell namens Checkout und ich muss eine Person aus dem Employee Modell in der neuen Checkout-Formular auswählen. Auscheckvorgänge und Mitarbeiter werden über ein Employment-Modell verknüpft.Wie verwendet man Rails 4 starke Parameter mit has_many: through association?

Ich erhalte diese Störung, wenn ich versuche, eine neue Kasse zu erstellen:

NoMethodError in CheckoutsController#create 
undefined method `employee' for #<Checkout:0x007ff4f8d07f88> 

Es scheint, dass mit etwas falsch gibt es entweder meine schaffen Aktion, meine Kasse Parameter oder meine neue Kasse Form. Hier ist die Aktion erstellen:

def create  
    @user = current_user 
    @checkout = @user.checkouts.build(checkout_params) 

    respond_to do |format| 
     if @checkout.save 
     format.html { redirect_to @checkout, notice: 'Checkout was successfully created.' } 
     else 
     format.html { render action: 'new' } 
     end 
    end 
    end 

Meine Kasse params:

def checkout_params 
     params.require(:checkout).permit(:job, :employee_ids, :shift, :date, :hours, :sales, :tips, :owed, :collected, :notes) 
end 

Meine neue Kasse Form:

<div class="field"> 
    <%= f.label :employee %><br> 
    <%= f.collection_select(:employee_ids, Employee.all.collect, :id, :full_name, {:prompt => "Please select"}) %> 
</div> 

Aber ich kann nicht herausfinden, was mit Rails 4 und stark verändert hat Parameter. In Rails 3 funktionierte diese Art von Assoziation und Form für mich mit attr_accessible anstelle von strong_parameters.

Relevante Dateien

Voll Trace des Fehlers: https://gist.github.com/leemcalilly/0cb9e2b539f9e1925a3d

models/checkout.rb: https://gist.github.com/leemcalilly/012d6eae6b207beb147a

Controller/checkouts_controller.rb: https://gist.github.com/leemcalilly/a47466504b7783b31773

views/checkouts/_form.html.erb

models/employee.rb: https://gist.github.com/leemcalilly/46150bee3e6216fa29d1

Controller/employees_controller.rb: https://gist.github.com/leemcalilly/04f3acdac0c9a678bca8

models/employment.rb: https://gist.github.com/leemcalilly/6adad966dd48cb9d1b39

db/schema.rb: https://gist.github.com/leemcalilly/36be318c677bad75b211

+0

Mit dem gleichen Problem. Ich denke, das Problem ist, dass, anstatt nur die Mitarbeiter-ID einzureichen, Collection select diese in einen Hash-Code umwandelt. in Ihrem Fall "employee_ids" => {"employee_id" => "1", "employee_id" => "1"}. Ich wette, wenn Sie Ihr Protokoll überprüfen, wird es eine Zeile geben, die sagt "unerlaubte Parameter: Mitarbeiter_IDs" oder ähnliches. – ctilley79

+0

Ich denke, das ist die richtige Richtung. Hier ist mein Entwicklungsprotokoll: https://gist.github.com/leemcalilly/cc2a71bef9a1e14fc5e6 Jetzt, wie man das repariert? –

+0

Ich habe meine checkout_params auf diese https://gist.github.com/leemcalilly/a71981da605187d46d96 aktualisiert, und jetzt bekomme ich einen 'Unpermitted Parameter' wie Sie hier sehen können: https://gist.github.com/leemcalilly/ef0a58695b7318f068ab –

Antwort

48

Beachten Sie, dass der Name, den Sie Ihre starken Parameter geben (Mitarbeiter, employee_ids, etc.) weitgehend irrelevant ist, weil es auf den Namen hängt Sie wählen einzureichen. Starke Parameter funktionieren auf Grund von Namenskonventionen nicht "magisch".

Der Grund https://gist.github.com/leemcalilly/a71981da605187d46d96 ist ein „Unzulässige Parameter“ Fehler auf ‚employee_ids‘ zu werfen, weil es eine Array von skalaren Werten erwartet, pro https://github.com/rails/strong_parameters#nested-parameters, nicht nur einen skalaren Wert.

# If instead of: 
... "employee_ids" => "1" ... 
# You had: 
... "employee_ids" => ["1"] 

Dann Ihre starke Parameter funktionieren würde, und zwar:

... { :employee_ids => [] } ... 

Da es eine Reihe von skalaren Werten, anstatt nur einen skalaren Wert zu empfangen.

0

Ich kann posten Sie die Genehmigungserklärung, die ich in einem meiner Controller verwende. Dies hat auch viele Assoziationen. Sie verschachteln das Erlaubnis-Array. Verwenden Sie die Suchzuordnung in Ihrer permit-Anweisung. Der einzige Unterschied sollte sein, dass Ihre Dateien nicht ein drittes Mal verschachtelt werden.

In meinem Fall ist die Assoziation Zitat has_many :quote_items.

QuoteItems has_many :quote_options, :through => quote_item_quote_options.

In quotes_controller.

rb
params.require(:quote).permit(:quote_date, :good_through, :quote_number, quote_items_attributes: [:id,:quote_id, :item_name, :material_id, quote_item_quote_options_attributes:[:quote_option_id,:quote_item_id,:qty,:_destroy,:id]]) 
+0

Ok, basierend darauf scheint es, dass das für mich funktionieren sollte params.require (: checkout) .permit (: job,: shift,: date,: Stunden,: Umsatz,: tipps,: geschuldet,: gesammelt,: Notizen, Mitarbeiter_Attribute: [: ID,: Vorname,: Nachname,: Nummer]) ', aber ich bekomme immer noch eine" undefined Methode "Mitarbeiter" 'Fehler.Ich habe alle diese Varianten versucht, aber immer noch diesen Fehler: https://gist.github.com/leemcalilly/91ab475cf2a9e819724e. Basierend auf der starken params-Dokumentation https://github.com/rails/strong_parameters#nested-parameters, scheint es, als könnte ich einfach '{: employees => []}' verwenden, aber das funktioniert auch nicht. –

4

Ok, also musste ich die Parameter nicht verschachteln. Das ist, was für mich funktionierte:

Hier ist die Kombination von Änderungen, die funktioniert.

Immer noch nicht ganz verstehen, warum dies obwohl gearbeitet.

+0

Da Sie keine Liste mit IDs übermitteln, lesen Sie bitte meine vorherige Erklärung. – Denzel

+0

Oh, am Anfang dieses Threads habe ich versucht, ': employee_id' zu übermitteln, wenn es' 'employee_ids' hätte sein sollen. Ich musste nie die Attribute verschachteln, oder? –

+1

Korrekt, abgesehen von der Namensgebung, mussten Sie die Attribute nie verschachteln, da Sie nur einen Skalarwert übermittelten. – Denzel

Verwandte Themen