2

私のモデルは今そのようなものです:

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の場合は検証されませんでした。

ここで私がやろうと思うように:

  if !: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)}
    valida

= 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"
4

1 に答える 1

0

:ifオプションまたはで条件付き検証を使用できます:unless。例:

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

他の構文の検証に関するRailsガイドを参照してください。最後の構文があなたのケースに最も適している可能性があります。

with_options :unless => :use_user_data do |order|
  order.validates :city, :presence => {:message =>  I18n.t(:city_not_chosen)}
  order.validates :zip, :presence => {:message =>  I18n.t(:zip_not_chosen)}
  order.validates :street, :presence => {:message =>  I18n.t(:street__not_chosen)}
  # ...
end
于 2013-01-15T18:30:31.257 に答える