Ich bin neu in RoR, aber ich habe entschieden, dass ich auch auf 4 lernen kann. Dies kann oder auch nicht eine gute Idee sein. Ich versuche, ein Formular mit geschachtelten Attributen zu erstellen, und ich kämpfe.Schienen 4 verschachtelte Attribute unerlaubte Parameter
Ich habe diese Railscast http://railscasts.com/episodes/196-nested-model-form-part-1 angeschaut und ich versuche, eine ähnliche Situation auf eigene Faust neu zu erstellen.
Ich habe eine Bill Objekt, das viele Due Objekte hat. Das Objekt Due gehört ebenfalls zu einer Person. Ich möchte ein Formular, wo ich die Bill und ihre Kinder Beiträge alle in einer Seite erstellen kann.
Die richtigen Felder werden auf der Seite gerendert (allerdings ohne ein Dropdown für Person) und das Senden ist erfolgreich. Doch keines der Kinder Beiträge werden in der Datenbank gespeichert und ein Fehler im Serverprotokoll geworfen:
Unpermitted parameters: dues_attributes
Gab es irgendeine Art von Veränderung in Rails 4, oder bin ich gerade etwas völlig fehlt.
Kurz vor dem Fehler, das Protokoll zeigt dies:
Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
"bill"=>{"company"=>"Comcast", "month"=>"April ",
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"},
"1"=>{"amount"=>"30", "person_id"=>"2"},
"2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}
Relevante Code wird unter
due.rb
class Due < ActiveRecord::Base
belongs_to :person
belongs_to :bill
end
bill.rb
class Bill < ActiveRecord::Base
has_many :dues, :dependent => :destroy
accepts_nested_attributes_for :dues, :allow_destroy => true
end
bills_controller.rb
# GET /bills/new
def new
@bill = Bill.new
3.times { @bill.dues.build }
end
Rechnungen/_form.html.erb
<%= form_for(@bill) do |f| %>
<div class="field">
<%= f.label :company %><br />
<%= f.text_field :company %>
</div>
<div class="field">
<%= f.label :month %><br />
<%= f.text_field :month %>
</div>
<div class="field">
<%= f.label :year %><br />
<%= f.number_field :year %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :dues do |builder| %>
<%= render 'due_fields', :f => builder %>
<% end %>
<% end %>
Rechnungen /_due_fields.html.erb
<div>
<%= f.label :amount, "Amount" %>
<%= f.text_field :amount %>
<br>
<%= f.label :person_id, "Renter" %>
<%= f.text_field :person_id %>
</div>
UPDATE bills_controller.rb: Das funktioniert!
def bill_params
params.require(:bill).permit(:company, :month, :year,
dues_attributes: [:amount,
:person_id])
end
Fix auf Formatierung konvertieren: params.require (: bill).permit (: Firma,: Monat,: Jahr,: dues_attributes => [: Betrag,: Person_ID]) –