2011-12-07 61 views
0

我有以下4種型號跳過驗證在關聯模型的一些成員在創建/更新

Hotel (name) 
    has_one :address 
    has_one :contact 
    has_one :bank_account 
    validates_presence_of :name 
    def build_dependencies 
    build_contact 
    build_address 
    build_bank_account 
    end 

Address (phone, street_address, hotel_id) 
    belongs_to :hotel 
    validates_presence_of :phone, :street_address 

Contact (name, email, hotel_id) 
    belongs_to :hotel 
    validates_presence_of :name, :email 

BankAccount (name, number, hotel_id) 
    belongs_to :hotel 
    validates_presence_of :name, :number 

在用來創建一個酒店一個形式,我需要輸入兩個名字和電子郵件的聯繫模式,但只有Address模式的電話。

HotelController#new 
    @hotel = Hotel.new 
    @hotel.build_dependencies #this creates empty Contact and Address to generate the form fields 
    #render the form to create the hotel 

HotelController#create 
    #receive form data 
    @hotel = Hotel.new 
    @hotel.build_dependencies 
    @hotel.save :validate => false 
    @hotel.attributes = params[:hotel] 
    @hotel.save :validate => false 

這是我能夠創建一個包含聯繫信息,地址和空銀行賬戶電話的酒店的唯一方法。我不得不打電話

@hotel.save :validate => false 

第一次保存酒店實例與BankAccount,地址,聯繫人的空白實例。然後我必須update_attributes的聯繫人和地址,然後

@hotel.save :validate => false 

確保原始表單數據完全按預期保存。

這毫無疑問是一段非常糟糕的代碼。誰能告訴我如何清理這個?

回答

0
Address 
    validates_presence_of :phone, :on => :create, :if => proc { |u| u.creating_hotel? } 
    validates_presence_of :street, :phone, :on => :update 

Contact 
    validates_presence_of :name, :email :on => :update 

def creating_hotel? 
    addressable_type == 'Hotel' 
end 

用戶在創建過程中看到創建的酒店後,才:street, :name, :email領域和:phone

0

您可以使用過濾器,即after_create調用相關模型@hotel變量保存後創建相關的記錄。

我碰巧面臨同樣的問題,這裏是我的解決方案。對不起,這可能是很長時間沒有幫助,但它會對未來的用戶有好處。

class User < ActiveRecord::Base 
has_one :bank_account 

# Filter -- After Creation 
after_create :create_default_bank_account 

def create_default_bank_account 
    self.build_bank_account 
    self.bank_account.save(:validate=>false) 
    # :validate=>false must be called on the bank_account's save. I made the mistake of trying to save the user. =(
end 

這種方式,你可以把空行創造了create行動,這恕我直言,應該屬於模型。然後,您可以使用edit操作讓用戶「創建」銀行賬戶條目。使用這個,你只需要一個標準的創建動作(例如由rails g scaffold_controller生成)。

更新:我在回答後重新閱讀您的問題,發現自己變得更加困惑。我假設你想呈現一個表單,用戶不希望立即進入銀行賬戶,而是稍後在另一頁面上進行編輯。

+0

感謝您的回答,但這是我做的...... – Rahul

相關問題