2012-01-20 11 views
8

Próbuję przenieść moją aplikację z Rails 3.0.7 do Rails 3.1.3. Mam model klientAsocjacje ActiveRecord są automatycznie zapisywane w przypisaniu po migracji między wersjami Rails, w jaki sposób mogę je wyłączyć?

class Client::Client < ActiveRecord::Base 
    has_one :contact_address, :class_name => "Address", :foreign_key => :client_id, :conditions => ["kind = ? and state = ?", 2, 1]  
end 

W metodzie edycji kontrolera I wykonanie tego kodu:

def edit 
    @client = params[:type].classify.constantize.find params[:id] 
    @client.contact_address = Address.new(:kind => 2) if @client.contact_address.blank? 
end 

W drugim wierszu tego kodu Dostaję błędzie:

Failed to save the new associated contact_address. 

Więc wydaje się, że przypisanie do @ client.contact_address jakoś wyzwalana metoda zapisu na obiekcie contact_address ... Nie chcę tego ... Czy to jest jakieś nowe zachowanie Rails 3.1.x? Chcę, aby powiązane obiekty były zapisywane tylko wtedy, gdy zadzwonię. Zachowaj! na modelu rodziców - to dla mnie za dużo magii. Czy mogę wyłączyć to zachowanie?

+1

Wyrażenie "@client = params [: type] .classify.constantize.find params [: id]" nie wygląda na bardzo bezpieczne: pozwalasz użytkownikom tworzyć instancje dowolnego typu obiektu, który przekazują jako parametr? –

Odpowiedz

8

Znalazłem obejście tego problemu. W metodzie kontrolery edycji Użyłem build metodę zamiast przypisania:

def edit 
    @client = params[:type].classify.constantize.find params[:id] 
    @client.build_contact_address(:kind => 2) if @client.contact_address.blank? 
end 

Ale nadal jestem zainteresowany, aby przeczytać o tym nowym zachowania gdzieś (mój googling był unsuccessfull). Może ktoś mógłby podać link?

+1

Uważam, że to zachowanie (podnoszenie ActiveRecord :: RecordNotSaved) jest bardzo zaskakujące i frustrujące. Żałuję, że po prostu nie zachowywał się jak normalna walidacja i zamiast tego dodawał błędy do mieszania błędów. –

Powiązane problemy