0

私はそのようなモデルを持っています:

class Order < ActiveRecord::Base
  attr_accessible :**** :phone_number, :receiver, :shipping_id, :street, :totalcost, :user_id, :zip, :use_user_data
  attr_accessor :use_user_data
  validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}
  validates :zip, :presence => {:message =>  I18n.t(:zip_not_chosen)}
  validates :street, :presence => {:message =>  I18n.t(:street__not_chosen)}
  validates :building, :presence => {:message =>  I18n.t(:building_not_chosen)}
  validates :phone_number, :presence => {:message =>  I18n.t(:phone_number_not_chosen)}
  validates :receiver, :presence => {:message =>  I18n.t(:receiver_not_chosen)}
end

ご覧のとおり、非 db フィールド (use_user_data) であるモデルにいくつかのフィールドを設定しました - 仮想属性...

しかし、:use_user_data が false の場合、適切で適切な検証が行われますが、true の場合は検証されませんでした。

私はそうしようとします:

validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}, :unless => :use_user_data

など

with_options :unless => :use_user_data do |order|
    order.validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}
  end

しかし、それは私を助けません.なぜですか?

また、私のフォーム:

= form_for @order do |f|
  %div
    = f.label :use_user_data , "Использовать данные вашего профиля*: "
    = label :use_user_data , "Да"
    = f.radio_button :use_user_data, true, :required => true, :id => "use_user_data", :checked => true
    = label :use_user_data , "Нет"
    = f.radio_button :use_user_data, false, :required => true, :id => "dont_use_user_data"

また、私が書くとき

validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}, :if => :use_user_data

検証メッセージが表示されます...しかし、falseの場合にのみ行う方法は? そして、なぜ私のソリューションが機能しなかったのですか?

4

2 に答える 2

2

trueフォームは、ブール値や。ではなく、「true」または「false」の文字列をオブジェクトに渡しますfalse。これは仮想属性であるため、型キャストは実行されません。Rubyでは、「true」と「false」の両方がtrueであるため、値を型キャストするには何かを使用する必要があります

with_options :unless => Proc.new{ |a| a.use_user_data == 'true' } do |order|
  order.validates ...
end

または

with_options :unless => :use_user_data? do |order|
  order.validates ...
end

def use_user_data?
  use_user_data == 'true'
end
于 2013-01-16T12:56:20.830 に答える
0

:ifor:unless条件をラムダ orに入れる必要がありますProc

validates ..., :if => Proc.new { |a| a.use_user_data === false }

これにより、検証中に:use_user_data上記の行が実行されるまでチェックが評価されなくなります( theは、Rails によって評価されるorオプションに値として渡されます) 。は現在のモデル属性を引数として受け取り、それらの属性(この場合は)確認できます。validatesProc:if:unlessProc:use_user_datafalse

于 2013-01-16T12:53:57.467 に答える