在一個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
方法之前運行。所以新城市的創建是在州選擇的任何值(包括如果是空白的情況下)。
什麼是更好的方式來構建我的代碼來實現預期的結果?謝謝
嗨veraricus,謝謝這是一個有用的開始。我確實希望將狀態保持爲選擇字段+新狀態文本字段。這在我的使用案例中更有意義。任何想法如何我可以實現這一點? –