2012-01-20 12 views
8

Uygulamamı Rails 3.0.7'den Rails 3.1.3'e taşımaya çalışıyorum. Bu yüzden görünüyorActiveRecord dernekleri, Rails sürümleri arasında geçiş yaptıktan sonra atamaya otomatik olarak kaydedilir, bunu nasıl devre dışı bırakabilirim?

Failed to save the new associated contact_address. 

: Ben hata alıyorum bu kodun ikinci satırında

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

: Ben bu kodu çalıştırmak kontrolörün düzenleme yönteminde istemci modeli

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

var atamak @ client.contact_address bir şekilde contact_address nesnesinde kaydetme yöntemini tetikledi ... Bunu istemiyorum ... Bu yeni Rails 3.1.x davranışı mı? İlişkili nesneleri yalnızca, .save dediğimde kaydetmek istiyorum. ebeveyn modelde - bu benim için çok fazla büyü. Bu davranışı bir yerlerde devre dışı bırakabilir miyim?

+1

"@client = params [: type] .classify.constantize.find params [: id]" ifadesi benim için çok güvenli görünmüyor: kullanıcılarınızın içeri aktardıkları herhangi bir nesne türünü başlatmasına izin veriyorsunuz. parametre? –

cevap

8

Bunun için geçici çözüm buldum. kontrolörleri düzenleme yönteminde ben atama yerine build yöntemini kullandım:

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

Ama hala (benim googling başarısızlığı, oldu) bir yere bu yeni davranışı hakkında okumak için intrested değilim. Belki birisi bir bağlantı sağlayabilir?

+1

Bu davranışı (ActiveRecord :: RecordNotSaved'i yükseltmek) çok şaşırtıcı ve sinir bozucu buluyorum. Ben sadece normal bir doğrulama gibi davrandı ve hatalar yerine hataları karma eklendi. –

İlgili konular