2015-04-30 48 views
2

我有一個嵌套屬性的Rails表單。用戶可以更新其caddy有2種方式:刪除具有嵌套屬性的驗證

  • 通過書面形式提供的地址到模型Address的嵌套屬性,
  • 或通過選擇複選框,意思是「我不想交付」

它生成一組則params的是這樣的:

{ 
    "id"=>"mine", 
    "caddy"=> { 
    "address_attributes"=>{"street"=>"", "city"=>"" [...]}, 
    "use_address"=>"1" 
    } 
} 

我的模型的某些部分:

Model Caddy < AR::Base 
    belongs_to :address 
    accepts_nested_attributes_for :address 
    attr_accessor :use_address 
end 

Model Address < AR::Base 
    validates :street, :presence => true 
end 

的問題是,當用戶檢查use_address複選框,則address_attributes不應該被使用,但它們是,提高從street存在驗證錯誤。

我試過這個方法添加到Caddy覆蓋由attr_accessor產生use_addresss=

def use_address=(v) 
    if v == '1' 
    self.address_id = nil 
    self.address_attributes = {} 
    self.address = nil 
    end 
    super 
end 

但它改變不了什麼(address_attributes應該nil然後是哈希PARAMS)。

我發現的唯一解決方案是直接將參數更改爲我的控制器,但它很糟糕。你有其他解決方案嗎?

回答

1

我通常做這與壓倒一切的assign_attributes

def assign_attributes(attrs) 
    unless ActiveRecord::ConnectionAdapters::Column.value_to_boolean(attrs.delete(:use_address)) 
    self.address && self.address.mark_for_destruction 
    # or self.address_id = nil if you don't want to destroy existing address 
    attrs.delete(:address_attributes) 
    end 
    super(attrs)  
end 
+0

不錯的辦法! – pierallard