Rails 根据另一个属性的值验证模型属性
Rails validate model attribute based on value of another attribute
我有一个 rails 应用,其用户模型具有州和城市属性。
我正在使用 gem 获取给定州和国家/地区的城市列表。
我希望在注册时,如果用户选择的城市不在用户选择的州的城市列表中,则不允许注册并显示错误。
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
应该指的是用户为 'state' 属性提交的值,但我认为这在这里不起作用。
我想将用户给定的状态值传递给函数CS.cities()
。
我该如何解决这个问题?
您可以使用获取当前用户实例的 proc 或 lambda 对象。这个实例你可以要求状态。 proc 或 lambda 应该 return 一个包含所有有效城市的可枚举。
改编自 rails v3.2 api:
validates :city, presence: true, inclusion: { :in => lambda{ |user| CS.cities(user.state.to_sym, :in) }}
您可以使用 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
我有一个 rails 应用,其用户模型具有州和城市属性。
我正在使用 gem 获取给定州和国家/地区的城市列表。
我希望在注册时,如果用户选择的城市不在用户选择的州的城市列表中,则不允许注册并显示错误。
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
应该指的是用户为 'state' 属性提交的值,但我认为这在这里不起作用。
我想将用户给定的状态值传递给函数CS.cities()
。
我该如何解决这个问题?
您可以使用获取当前用户实例的 proc 或 lambda 对象。这个实例你可以要求状态。 proc 或 lambda 应该 return 一个包含所有有效城市的可枚举。
改编自 rails v3.2 api:
validates :city, presence: true, inclusion: { :in => lambda{ |user| CS.cities(user.state.to_sym, :in) }}
您可以使用 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