it-swarm.com.de

Wie benutzt man Rails 4 starke Parameter mit has_many: durch Assoziation?

Ich habe Probleme, eine has_many zu bekommen: durch die Verknüpfung mit den starken Parametern von Rails 4. Ich habe ein Modell mit dem Namen Checkout und muss eine Person aus dem Employee model im neuen Checkout-Formular. Checkout und Mitarbeiter werden über ein Employment model zugeordnet.

Ich erhalte diese Fehlermeldung, wenn ich versuche, eine neue Kaufabwicklung zu erstellen:

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

Es scheint, dass etwas mit meiner Erstellungsaktion, meinen Checkout-Parametern oder meinem neuen Checkout-Formular nicht stimmt. Hier ist die Erstellungsaktion:

  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 Checkout-Parameter:

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

Mein neues Checkout-Formular:

<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 sich mit Rails 4 und starken Parametern geändert hat. In Rails 3 funktionierte diese Art der Zuordnung und Form für mich stattdessen mit attr_accessible von starken_parametern.

Relevante Dateien

Volle Spur 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/a47466504b7783b3177

views/checkouts/_form.html.erb https://Gist.github.com/leemcalilly/ce0b4049b23e3d431f55

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

controller/employee_controller.rb: https://Gist.github.com/leemcalilly/04f3acdac0c9a678bca8

models /ployment.rb: https://Gist.github.com/leemcalilly/6adad966dd48cb9d1b39

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

34
Lee McAlilly

Denken Sie daran, dass der Name, den Sie Ihren starken Parametern (Angestellten, Angestellten-IDs usw.) geben, weitgehend irrelevant ist, da er vom Namen abhängt, den Sie übermitteln möchten. Starke Parameter wirken keine "Magie" basierend auf Namenskonventionen.

Der Grund, warum https://Gist.github.com/leemcalilly/a71981da605187d46d96 einen Fehler "Unpermitted parameter" für 'employee_ids' auslöst, ist, dass ein Array erwartet wird von Skalarwerten pro https://github.com/Rails/strong_parameters#nested-parameters , nicht nur ein Skalarwert.

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

Dann würden Ihre starken Parameter funktionieren, und zwar:

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

Weil es ein Array von Skalarwerten statt nur eines Skalarwerts empfängt.

53
Denzel

Ok, also brauchte ich die Parameter eigentlich nicht zu verschachteln. Dies ist, was für mich gearbeitet hat:

# Never trust parameters from the scary internet, only allow the white list through.
def checkout_params
  params.require(:checkout).permit(:job, :shift, :employee_ids, :date, :hours, :sales, :tips, :owed, :collected, :notes)
end

Hier ist die Kombination der Änderungen, die funktioniert haben.

Ich verstehe immer noch nicht ganz, warum das so war.

4
Lee McAlilly

Ich kann die Erlaubniserklärung, die ich in einem meiner Controller verwende, posten. Dies hat auch viele zu viele Assoziationen. Sie verschachteln das Erlaubnisfeld. Verwenden Sie die Lookup-Zuordnung in Ihrer Genehmigungserklärung. Der einzige Unterschied sollte sein, dass Ihre nicht ein drittes Mal verschachtelt werden.

In meinem Fall ist der Verein Quote 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
ctilley79