在我的Rails應用程序中,我有用戶。用戶被要求提供他們的家鄉城市和地區/社區。Rails:按特定順序創建屬性
class User < ActiveRecord::Base
belongs_to :city
belongs_to :district
end
class City < ActiveRecord::Base
has_many :users
has_many :districts
end
class District < ActiveRecord::Base
has_many :users
belongs_to :city
end
在形式我建立使用接受字符串(下面的情況下,它的相關詳細信息)上的用戶模型中的虛擬屬性的關聯。
在控制檯中,這一切都很好,但在UI中不起作用。問題似乎是,我可以通過一個形式獲得city_name
沒問題,但是當我嘗試以相同的形式分配城市和地區時,它總是失敗。換句話說,批量分配不起作用。
@user.update_attributes(params[:user])
相反,我已經能夠找出的唯一事情就是手動設置從表單提交每個鍵,如:
@user.name = params[:user][:name] if params[:user][:name]
@user.city_name = params[:user][:city_name] if params[:user][:city_name]
@user.district_name = params[:user][:district_name] if params[:user][:district_name]
這種方法的工作原理,但它是一個痛苦,那種脆,並且感覺全部錯誤,因爲它開始用很多邏輯來控制控制器。
我的問題是:
有沒有一種方法來創建或更新以特定的順序屬性,最好的模式,使控制器不擔心這一切?
我做錯了嗎?如果是這樣,哪種方法會更好。
額外的資訊
下面是如何建立使用用戶模型的虛擬屬性的關聯,如果這是有關任何潛在的回答者:
我希望用戶能夠通過輸入一個名字來選擇一個城市,例如「Chicago,IL」。這工作得很好,在使用像這樣的用戶模型虛擬屬性:
def city_name
city.try :full_name
end
def city_name=(string)
self.city = City.find_or_create_by_location_string(string)
end
很有道理的用戶找到或創造從他們所選擇的城市區。此作品略有不同:
def district_name
district.try :name
end
def district_name=(string)
if self.city.nil?
raise "Cannot assign a district without first assigning a city."
else
self.district = self.city.districts.find_or_create_by_name(string)
end
end
在這些東西做工精細的模型層,如預期只要雙方一CITY_NAME和district_name設置區協會工作。
這是一個好主意。我能夠根據爲ID使用隱藏字段的想法重新設置我的設置,而不是將字符串傳遞給模型,這使得它更簡單。感謝你的建議,你讓我走上了正軌。 – Andrew 2012-03-19 02:48:29