2012-04-03 13 views
0

私はRailsとRubyを初めて使用しています。私の見解では、アメリカの居住者であるかどうか尋ねる2つのラジオボタンがあります。そうであれば、状態選択が表示されます。そうでない場合、国選択が表示されます。入れ子オブジェクトから単一の属性を検証する方法

米国の居住者である場合は、状態が選択されたことを検証しようとしています。

バリデーションを作成し、addresses_attributesから状態にアクセスするにはどうすればよいですか?

"resident"=>"true", 
"addresses_attributes"=>{"0"=>{"country_code"=>"", 
"state"=>""}} 

答えて

0

右向きに私を指すのに役立つ@VelLes。 @VelLesの例を少し変更しなければならないので、私自身の質問に答えています。私は、他の人に完全な解決策を見せたいと思っています。

仮想属性としてattr_accessorを使用しているので、true/false値がラジオボタンから入力されると、文字列として格納されます。したがって、self.resident = "false"の場合、trueに評価されます。

self.resident == 'false'を実行するか、ブール値に変換して新しいself.residentを追加できますか?方法。私は後者を選んだ。

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 

は私がより良い「レール」があれば教えてください:

ブール変換が

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 

私の最終的なコードがある/初期化子configにファイルに追加し、this blog postから来ましたこれを行う方法!

1

あなたはカスタム検証方法が必要になります。これらは、送信されている関連するパラメータです

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 
1

代わりにvalidates_inclusion_ofを使用して並べ替えることができます。

RubyのAPIは言う:

あなたは(実際の値がfalse真と>です)ブールフィールドの存在を確認したい場合は、validates_inclusion_of使いたいでしょう:FIELD_NAME、:=に> [正誤]。

これはObject#が空白のためですか?ブール値を扱います:false.blank? #=> true。

関連する問題