Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从嵌套对象验证单个属性_Ruby On Rails_Validation_Activerecord - Fatal编程技术网

Ruby on rails 如何从嵌套对象验证单个属性

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

我不熟悉Rails和Ruby。在我看来,我有两个单选按钮,询问此人是否是美国居民。如果是,则显示状态选择。如果没有,则显示国家/地区选择

如果某人是美国居民,我试图验证是否选择了某个州

如何创建验证并访问addresses_属性之外的状态

这是我的模型:

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