Zagnieżdzony formularz - problem z zapisaniem do bazy

Cześć,

próbuje zrobić zagnieżdżony formularz i mam problem z zapianem do bazy obiektów podrzędnych formularza.

W kontrolerze, w metodzie new tak to wygląda:

def new @invoice = Invoice.new @invoice.build_from @invoice.build_to @invoice.line.build end
metoda create:

[code]def create
@invoice = Invoice.new(invoice_params)

respond_to do |format|
  if @invoice.save
    format.html { render action: 'index', notice: 'Invoice was successfully created.' }
    format.json { render action: 'show', status: :created, location: @invoice }
  else
    format.html { render action: 'new' }
    format.json { render json: @invoice.errors, status: :unprocessable_entity }
  end
end

end[/code]
a invoice_params tak:

def invoice_params params.require(:invoice).permit(:number, :date_issued, :payment_due, :description, :payment_description, from_attributes: [:id, :name, :email, :more_info], to_attributes: [:id, :name, :email, :more_info], lines_attributes: [:id, :product_description, :unit, :unit_value, :quantity, :vat_value, :line_total]) end
Z góry dzięki za pomoc w rozwiązany tego problemu :slight_smile:

Pokaż jeszcze powiżzane modele (te od build_to, build_from, build_line) oraz erb / haml formularza

model Invoice

[code]class Invoice < ActiveRecord::Base
has_one :from, autosave: true
has_one :to, autosave: true
has_many :line, autosave: true

accepts_nested_attributes_for :line
accepts_nested_attributes_for :from
accepts_nested_attributes_for :to

end[/code]
model Line

class Line < ActiveRecord::Base belongs_to :invoice end
model From

class From < ActiveRecord::Base belongs_to :invoice end
model To

class To < ActiveRecord::Base belongs_to :invoice end
view

[code]<%= form_for @invoice do |f| %>
<%= f.text_field :number, :placeholder => “Invoice number” %>
<%= f.fields_for :froms do |from| %>
<%= from.label :name, “From” %>
<%= from.text_field :name, :placeholder => “Name” %>
<%= from.email_field :email, :placeholder => “Email” %>
<%= from.text_area :more_info, :rows => “3” %>
<% end %>
<%= f.fields_for :tos do |to| %>
<%= to.label :name, “From” %>
<%= to.text_field :name, :placeholder => “Name” %>
<%= to.email_field :email, :placeholder => “Email” %>
<%= to.text_area :more_info, :rows => “3” %>
<% end %>
<%= f.fields_for :lines do |line| %>

<%= line.text_field :product_description, :placeholder => "Product/Service" %> <%= line.text_field :unit, :placeholder => "Unit" %> <%= line.text_field :unit_value, :placeholder => "Unit value" %> <%= line.text_field :quantity, :placeholder => "Qnt" %> <%= line.text_field :vat_value, :placeholder => "VAT" %> <%= line.text_field :line_total, :disabled => true, :value => "0.00" %> <% end %> <% end %>[/code]

O ile pamiętam, przy has_one powinieneś mieć pojedynczą liczbę, więc powinno być “fields_for :to do”, co nie zmienia faktu, że nazwa modelu jest po prostu niekomfortowa.

Dla faktur użyłbym raczej issuer i receiver / recipient (odbiorca nazywa się chyba invoicee, ale też nie jest zbyt nazwa). Na pewno łatwiej będzie ci tego używać, niż “to” i “from” (tos, froms?)

Dziękuje Adept, rzeczywiście jest tak jak piszesz.

Teraz mam problem z modelem Line, jak mam wpisane w kontrolerze

@invoice.bulid_lines

to pojawia mi się błąd

a jak zmienię na

@invoice.lines.bulid

to nie pojawia się błąd, ale nie zapisuje danych tego modelu w bazie.

Z czym może być porblem?

z rozkjoarzniem :wink: build, a nie bulid. To po pierwsze, a po drugie, w bazie nie zapisuje metoda build, tylko create :slight_smile:

Myślę, że warto na jednej z kart mieć otwarte http://api.rubyonrails.org/. Na takie, jakby nie było, proste pytania, dużo szybciej odpowiedź znajdziesz tam niż ktoś Ci odpisze na forum.

Słuchajcie, dzięki za pomoc. Rzeczywiście problem był absurdalny i związany raczej z rozkojarzeniem :slight_smile:

Już wszystko działa jak miało działać.