0

Rails と Ruby は初めてです。私の見解では、その人が米国の居住者かどうかを尋ねる 2 つのラジオ ボタンがあります。そうであれば、状態選択が表示されます。そうでない場合は、国の選択が表示されます。

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

検証を作成し、addresses_attributes から状態にアクセスするにはどうすればよいですか?

これが私のモデルです:

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

送信される関連パラメータは次のとおりです。

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

3 に答える 3

1

カスタム検証方法が必要です。

   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 
于 2012-04-03T23:55:11.683 に答える
1

代わりに validates_inclusion_of を使用して整理できます。

Ruby API は次のように述べています。

ブール値フィールド (実際の値は true と >false) の存在を検証する場合は、validates_inclusion_of :field_name, :in => [true, false] を使用する必要があります。

これは Object#blank? の方法によるものです。ブール値を処理します: false.blank? # => 真。

于 2012-06-07T02:28:31.647 に答える
0

私を正しい方向に向ける手助けをしてくれる@VelLesに+1してください。@VelLesの例を少し変更して機能させる必要があり、他の人に完全な解決策を見てもらいたいので、私は自分の質問に答えています。

attr_accessorを仮想属性として使用しているため、ラジオボタンからtrue / false値が入力されると、文字列として格納されます。したがって、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 

これを行うためのより良い「レール」の方法があるかどうか私に知らせてください!

于 2012-04-04T15:48:25.613 に答える