4

我想验证这两个属性的存在:shipping_cost以及:shipping_cost_anywhere该属性:shipping是否等于true. 而如果

我的模型中有这个,但对我来说不能正常工作:

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true" if :shipping == "true"

这是我的 :shipping 属性:

field :shipping, :type => Boolean, :default => "false"

我该怎么做?

谢谢!

已编辑。

我正在使用 mongoid 和 simple_form 宝石

4

6 回答 6

12
validates_presence_of :shipping_costs_anywhere, :if => :should_be_filled_in?

def should_be_filled_in?
  shipping_costs_anywhere == "value"
end

该方法在语句中调用时将返回 true 或 false。无需在 shipping_costs_anywhere 前面加上冒号。

于 2012-05-08T15:20:51.247 回答
5

对我来说这个问题的解决方法是下一个代码:

validates :shipping_cost, :shipping_cost_anywhere, :presence => true, :if => :shipping?

感谢大家的帮助,但任何答案都对我有用。谢谢!

于 2012-05-08T16:29:04.090 回答
4

今天偶然发现了这个,并认为我会更新答案。正如其他人提到的,您可以将逻辑放入函数中。但是,您也可以将其放入 proc 中。

validates_presence_of :shipping_costs_anywhere, :if => Proc.new { |o|
  o.shipping_costs_anywhere == "value"}

http://guides.rubyonrails.org/active_record_validations.html#using-a-symbol-with-if-and-unless

于 2013-11-22T21:09:36.253 回答
4

现在validates优先于validates_presences_of等。正如 hyperjas 提到的,您可以这样做:

validates :shipping_cost,
  :shipping_cost_anywhere,
  :presence => true, :if => :shipping?

:shipping_cost但是,这会限制和的整个验证:shipping_cost_anywherevalidate为了更好的可维护性,我更喜欢为每个属性单独声明。

更重要的是,您可能会遇到多个验证条件不同的情况(例如一个用于存在,另一个用于长度、格式或值)。你可以这样做:

validates :shipping_cost,
  presence: { if: :shipping? },
  numericality: { greater_than: 100, if: :heavy? }

你也可以让 rails 评估一个 ruby​​ 字符串。

validates :shipping_cost,
  presence: { if: "shipping?" },
  numericality: { greater_than: 100, if: "shipping? and heavy?" }

最后,可选择添加单独的自定义消息:

validates :shipping_cost,
  presence: { if: "shipping?", message: 'You forgot the shipping cost.' },
  numericality: { greater_than: 100, if: "shipping? and heavy?", message: 'Shipping heavy items is $100 minimum.' }

等等。希望有帮助。

于 2016-04-08T19:15:13.930 回答
1

我无法测试它,但我认为语法更像:

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true", :if => "shipping.nil?"

看:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation

于 2012-05-08T15:22:13.373 回答
0

这是我为我工作的代码。在 if 条件下调用方法而不是比较

 validates :prefix, :allow_blank => true, :uniqueness => { :case_sensitive => true } ,:if => :trunk_group_is_originating?


        def trunk_group_is_originating?
          if self.direction == "originating"
            true
          else
            false
          end
        end

希望对你有帮助…………

于 2012-05-08T15:16:06.637 回答