2012-06-30 51 views
0

在一個Rails 3.2窗體中,我有一個連接setter方法的find_or_create字段,並且我有一個方法,當前正在運行before_validate。我需要before_validate方法在setter方法之前運行。我應該如何修改我的代碼來實現這一目標?創建記錄時,如何確保在setter_method初始化之前運行方法?

我的表單包含:

<%= f.select(:country_id, Country.order(:name), :id, :name, include_blank:true) %> 
<%= f.grouped_collection_select :state_id, Country.order(:name), :states, :name, :id, :name, include_blank: true %> 
<%= f.text_field :new_state_name, placeholder: "..or enter a new state" %> 
<%= f.input :city_name %> 

在模型中我有

def city_name 
city.try(:name) 
end 

def city_name=(name) 
    if name.present? 
    set_city = City.find_or_initialize_by_name_and_state_id(name, self.state_id) 
    if set_city.new_record? 
     set_city.state_id = state_id 
     set_city.save(:validate => false) 
     self.city = set_city 
    else 
     self.city = set_city 
    end 
    end 
end 

before_validation :create_new_state 

def create_new_state 
    if new_state_name.present? && country_id.present? 
    new_state = State.create(name: new_state_name, country_id: country_id) 
    self.state = new_state.id 
    end 
end 

的想法是,用戶可以選擇一個國家,一個國家,然後在被發現一個城市名稱反對名稱和國家。如果不存在這樣的城市,則創建它。

另外,如果select字段中不存在所需的狀態,則用戶可以改爲在new_state_name字段中鍵入新狀態。在保存時,新的狀態被創建,並且應該與新的城市相關聯(如果進入新的狀態,城市必須是新的)。

我遇到的問題是city_name setter似乎在before_validation方法之前運行。所以新城市的創建是在州選擇的任何值(包括如果是空白的情況下)。

什麼是更好的方式來構建我的代碼來實現預期的結果?謝謝

回答

0

這是我該怎麼做。 (希望你不介意我改變了一下週圍的型號代碼。)

delegate :name, to: :city, prefix: true 
delegate :name, to: :state, prefix: true 

attr_writer :city_name, :state_name 
attr_accessible :city_name, :state_name 

before_validate :find_or_create_city_and_state 

validates :city, :state, presence: true 

private 

def find_or_create_city_and_state 
    if state_name 
    state = State.find_or_create_by_name_and_country_id(state_name, country.id) 
    self.state = state 

    if city_name # Nested since this doesn't make any sense without a state, presumably 
     city = City.find_or_create_by_name_and_state_id(city_name, state.id) 
     self.city = city 
    end 
    end 
end 

在您的形式,調用領域city_namestate_name,你應該是好去。

+0

嗨veraricus,謝謝這是一個有用的開始。我確實希望將狀態保持爲選擇字段+新狀態文本字段。這在我的使用案例中更有意義。任何想法如何我可以實現這一點? –

相關問題