Mam dwa modele: user i company_owner
Używam “accepts_nested_attributes_for”, aby za jednym zamachem podczas tworzenia użytkownika, aby stworzył mi company_owner’a.
class User < ActiveRecord::Base
has_one :company_owner
accepts_nested_attributes_for :company_owner
validates_associated :company_owner #tu jest dalsza validajca
end
class CompanyOwner < ActiveRecord::Base
belongs_to :user, :class_name => “User”, :foreign_key => “user_id” #tu jest validacja
end
Wszystko się robi pięknie i super, ale podczas kiedy wypisuję errory walidacji (error_messages_for ‘user’) to wyświetlane są błędne pola tylko obiektu nadrzędnego (w tym wypadku “User”).
Rails “opakowuje” błędnie wypełnione pola w div’y o odpowiedniej klasie, ale tylko właśnie te z klasy nadrzędnej.
W jaki sposób pokazać błędy walidacji w klasie zagnieżdżonej ?
pozdrawiam
Może pomocne będzie że tworzenie obiektu odbywa się w następujący sposób:
Ogólnie chodzi o to, że jak mam zagnieżdżone obiekty, to przy walidacji, błędne pola opakowywane są w divy z klasą fieldWithErrors, ale tylko te divy z klasy nadrzędnej, chociaż error_messages_for pokazuje wszystkie błędnie wypełnione pola (nawet z klasy zagnieżdźonej).
Nawet ActionView::Base.field_error_proc ma w sobie tylko pola z klasy nadrzędnej.
class Account < ActiveRecord::Base
has_one :address, :dependent => :destroy
validates_associated :address
accepts_nested_attributes_for :address, :allow_destroy => true
end
Kontroler
[code=Ruby]class AccountsController < ApplicationController
def new @account = Account.new @account.address ||= Address.new
end
def create @account = Account.new( params[:account] ) @account.save!
flash[:notice] = ‘Konto zostało utworzone’
redirect_to :root
rescue ActiveRecord::RecordInvalid
render :action => :new
end
end[/code]
Widok new.html.erb
<% form_for(@account) do |f| %>
<%= error_messages_for :account %>
<%= render :partial => 'addresses/form', :object => f %>
<% end %>
Widok addresses/form.html.erb
<% form.fields_for :address do |address| %>
<%= address.text_field :street %>
<%= address.error_message_on :street %>
<% end %>
Wszystko się ładnie opakowuje i błędy wyświetlają się. O to chodziło?
Wzorowałem się na nim i wszystko poszło. Pewnie chodziło właśnie o użycie funkcji new i create, a w szczególności funkcji new gdzie dodawało się na samym początku zagnieżdżony obiekt.