nested_attibutes i validacja modeli zanieżdżonych

Witam,

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:

usr = User.new(:name=>“Jan”, :surname => “Kowalski”, :company_owner_attributes => {:comp_name=>“Firma”, :address=>“tutaj adres firmy”})

Trochę może zawile to napisałem.

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.

Działający przykład z kontem, które ma adres:

Model

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?

hej,

Właśnie o to mi chodziło, aczkolwiek nie wiem dlaczego ale Twoje rozwiązanie nie działało u mnie dobrze. Znalazłem podobny przykład: http://github.com/anathematic/has_one_problem/tree/master

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.

Dzięki serdecznie za pomoc.

pozdrawiam