0

shipping_address請求先住所と同じでない限り、 の存在を検証したいと考えています。私はそれのために書いたattr_writer。この属性をチェックしたオブジェクトで初期化したい。

class Order < ActiveRecord::Base
  attr_writer :ship_to_billing_address
  accepts_nested_attributes_for :billing_address, :shipping_address

  validates :shipping_address, presence: true, unless: -> { self.ship_to_billing_address? }

  def ship_to_billing_address
    @ship_to_billing_address = true if @ship_to_billing_address.nil?
    @ship_to_billing_address
  end

  def ship_to_billing_address?
    ship_to_billing_address
  end
end

フォームは次のとおりです。

# Use my shipping address as billing address.
= f.check_box :ship_to_billing_address

ただし、これは機能しません。フォームは値として 0 と 1 を送信します。そこで、メソッドを次のように変更しました。

  def ship_to_billing_address?
    ship_to_billing_address == 1 ? true: false
  end

次に、検証がまだ開始されているかどうかを確認するために、これに進みます...

  def ship_to_billing_address?
    true
  end

ただし、 false が返された場合でも、検証はまだ開始されています。

3時間後、これを修正する方法がありません...

4

1 に答える 1

4

デフォルトでは、 orではなくso orcheck_boxの文字列を返します。値をテストするときは、この点に注意してください。これがドキュメントです。'1''0'10

また、おそらく to を変更しattr_writerattr_accessor他のメソッドをスキップするので、次のようなものです

class Order < ActiveRecord::Base
  attr_accessible :ship_to_billing_address
  accepts_nested_attributes_for :billing_address, :shipping_address

  validates :shipping_address, presence: true,
                               unless: -> { ship_to_billing_address > '0' }
end

accepts_nested_attributes_for呼び出しについてもよくわかりません- :billing_addressand :shipping_addresschildren オブジェクトですか、それとも単なる属性ですか?

于 2013-05-08T21:26:26.263 に答える