0

我有这样的模型:

class Order < ActiveRecord::Base
  attr_accessible :**** :phone_number, :receiver, :shipping_id, :street, :totalcost, :user_id, :zip, :use_user_data
  attr_accessor :use_user_data
  validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}
  validates :zip, :presence => {:message =>  I18n.t(:zip_not_chosen)}
  validates :street, :presence => {:message =>  I18n.t(:street__not_chosen)}
  validates :building, :presence => {:message =>  I18n.t(:building_not_chosen)}
  validates :phone_number, :presence => {:message =>  I18n.t(:phone_number_not_chosen)}
  validates :receiver, :presence => {:message =>  I18n.t(:receiver_not_chosen)}
end

如您所见,我在模型中设置了一些非数据库字段(use_user_data)的字段-虚拟属性...

但是怎么办,如果 :use_user_data 是假的,好的和正确的验证,但是当真时没有验证?

我这样尝试:

validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}, :unless => :use_user_data

所以

with_options :unless => :use_user_data do |order|
    order.validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}
  end

但这对我没有帮助...为什么?

还有我的表格:

= form_for @order do |f|
  %div
    = f.label :use_user_data , "Использовать данные вашего профиля*: "
    = label :use_user_data , "Да"
    = f.radio_button :use_user_data, true, :required => true, :id => "use_user_data", :checked => true
    = label :use_user_data , "Нет"
    = f.radio_button :use_user_data, false, :required => true, :id => "dont_use_user_data"

还有当我写

validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}, :if => :use_user_data

我收到验证消息...但是只有在错误的情况下怎么办?为什么我的解决方案不起作用?

4

2 回答 2

2

表单将“true”或“false”字符串传递给对象,而不是布尔值truefalse。因为它是一个虚拟属性,所以没有进行类型转换。在 Ruby 中,"true" 和 "false" 都是true,所以你需要使用一些东西来对值进行类型转换

with_options :unless => Proc.new{ |a| a.use_user_data == 'true' } do |order|
  order.validates ...
end

或者

with_options :unless => :use_user_data? do |order|
  order.validates ...
end

def use_user_data?
  use_user_data == 'true'
end
于 2013-01-16T12:56:20.830 回答
0

您需要将:ifor:unless条件放入 lambda 或Proc.

validates ..., :if => Proc.new { |a| a.use_user_data === false }

这会导致在验证期间执行上述行:use_user_data之前不会评估检查作为值传递给or选项以由 Rails 评估)。将接收当前模型属性作为参数,允许您检查这些属性(在本例中为 being validatesProc:if:unlessProc:use_user_datafalse

于 2013-01-16T12:53:57.467 回答