Rails基于另一个属性的值验证模型属性

时间:2016-04-07 12:01:02

标签: ruby-on-rails ruby ruby-on-rails-3 validation

我有一个带有用户模型的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()。 我该如何解决这个问题?

2 个答案:

答案 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