【问题标题】:Rails validate model attribute based on value of another attributeRails 根据另一个属性的值验证模型属性
【发布时间】:2016-04-07 12:01:02
【问题描述】:

我有一个带有用户模型的 Rails 应用程序,它具有州和城市属性。
我正在使用 gem 来获取给定州和国家的城市列表。
我希望在注册时,如果用户选择的城市不在用户选择的州的城市列表中,则不允许注册并显示错误。

验证:state,存在:true,包含:{ in: CS.states(:in).keys.collect{|x| x.to_s } } 验证 :city,存在:true,包含:{ in: CS.cities((:state).to_sym, :in) }

我在 user.rb 模型中编写了这段代码,但它不起作用。
:state 应该引用用户提交的“状态”属性值,但我认为这在这里不起作用。 我想将用户给定的状态值传递给函数CS.cities()。 我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您可以使用获取当前用户实例的 proc 或 lambda 对象。这个实例你可以要求状态。 proc 或 lambda 应该返回一个包含所有有效城市的枚举。

    改编自rails v3.2 api:

    validates :city, presence: true, inclusion: { :in => lambda{ |user| CS.cities(user.state.to_sym, :in) }}
    

    【讨论】:

      【解决方案2】:

      您可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多