Ruby on rails 如何从嵌套对象验证单个属性
我不熟悉Rails和Ruby。在我看来,我有两个单选按钮,询问此人是否是美国居民。如果是,则显示状态选择。如果没有,则显示国家/地区选择 如果某人是美国居民,我试图验证是否选择了某个州 如何创建验证并访问addresses_属性之外的状态 这是我的模型:Ruby on rails 如何从嵌套对象验证单个属性,ruby-on-rails,validation,activerecord,Ruby On Rails,Validation,Activerecord,我不熟悉Rails和Ruby。在我看来,我有两个单选按钮,询问此人是否是美国居民。如果是,则显示状态选择。如果没有,则显示国家/地区选择 如果某人是美国居民,我试图验证是否选择了某个州 如何创建验证并访问addresses_属性之外的状态 这是我的模型: class Person < ActiveRecord::Base has_many :addresses, :as => :addressable has_one :user accepts_nested_attri
class Person < ActiveRecord::Base
has_many :addresses, :as => :addressable
has_one :user
accepts_nested_attributes_for :user, :allow_destroy => true
accepts_nested_attributes_for :addresses
attr_accessor :resident
attr_accessible :campaign_id,
:first_name,
:last_name,
:user_attributes,
:addresses_attributes,
:resident
validates :first_name, :presence => true
validates :last_name, :presence => true
validates_presence_of :resident, :message => "must be selected"
end
您需要自定义验证方法
validate :check_state_presence
def check_state_presence
if self.resident && !self.addresses.state.present?
self.errors[:base] << "You need to Select State if you are a US resident."
end
end
validate:检查是否存在状态
def检查_状态_存在
如果self.resident&!self.address.state.present?
self.errors[:base]+1到@VelLes,以帮助我指出正确的方向。我在回答我自己的问题,因为我必须对@VelLes示例进行一些更改,以使其发挥作用,我希望其他人看到完整的解决方案
因为我使用attr_accessor作为虚拟属性,所以当从单选按钮输入真/假值时,它将存储为字符串。因此,如果self.resident
=“false”,它将被计算为true
您可以执行self.resident==“false”
或转换为布尔值并添加新的self.resident?方法。我选择了后者
布尔转换来自,添加到config/initializers中的文件
class String
def to_bool
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
return false if self == false || self.blank? || self =~ (/(false|f|no|n|0)$/i)
raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
end
end
我的最终代码是:
validate :check_state_presence
def resident?
resident.to_bool
end
def check_state_presence
if self.resident? && !self.addresses[0].state.present?
#the inline version of the error message
self.addresses[0].errors.add(:state, "must be selected")
end
end
请让我知道是否有更好的“rails”方法来做到这一点 您可以使用validates\u inclusion\u代替
Ruby API说:
如果要验证布尔字段的存在性(其中实值为true和>false),则需要使用validates\u inclusion\u of:field\u name,:in=>[true,false]
这是由于对象为空的方式造成的?处理布尔值:false.blank?#=>对
validate :check_state_presence
def resident?
resident.to_bool
end
def check_state_presence
if self.resident? && !self.addresses[0].state.present?
#the inline version of the error message
self.addresses[0].errors.add(:state, "must be selected")
end
end