我有一个带有用户模型的rails应用程序,它具有州和城市属性 我正在使用宝石来获取给定州和国家的城市列表 我希望在注册时如果用户选择的城市不在用户选择的州的城市列表中,则不允许注册并显示错误。
validates :state, presence: true, inclusion: { in: CS.states(:in).keys.collect{|x| x.to_s } } validates :city, presence: true, inclusion: { in: CS.cities((:state).to_sym, :in) }
我在user.rb模型中编写了这段代码,但它无法正常工作
:state
应该引用用户提交的州的状态'属性,但我不认为这是在这里工作。
我想将用户给出的状态值传递给函数CS.cities()
。
我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用获取当前用户实例的proc或lambda对象。这个例子你可以要求国家。 proc或lambda应该返回一个包含所有有效城市的枚举。
改编自rails v3.2 api:
validates :city, presence: true, inclusion: { :in => lambda{ |user| CS.cities(user.state.to_sym, :in) }}
答案 1 :(得分:0)
您可以使用before_save
过滤器执行此操作:
:before_save :check_city_state
def check_city_state
unless CS.cities((:state).to_sym).include?(self.city)
self.errors.add(:city, "select city within the selected state.")
return
end
end