2013-01-16 44 views
0

我有这样的模式:验证字段只有virt_attribute是假

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 

正如你可以看到我设置模型的一些领域,其是非数据库字段(use_user_data) - 虚拟属性...

但是怎么做,如果:use_user_data是错误的,好的和正确的验证,但是当真实没有验证?

我尝试这样:

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 

我得到验证消息......但是怎么办只有假的?为什么我的解决方案不起作用?

+0

没有,但你可以清理你许多':消息'参数使用* implict *查找:http://stackoverflow.com/a/2859275/23368 –

+0

@DanielRikowski以及如何更改....没有unserstand,删除消息?和? – brabertaser19

+1

只需在“错误消息范围”(http://guides.rubyonrails.org/i18n.html#error-message-scopes)中Rails I18n指南中描述的方式设置您的语言环境文件,Rails就会自动使用它们。 –

回答

2

表单将“true”或“false”字符串传递给对象,而不是布尔型truefalse。由于它是一个虚拟属性,因此不会执行类型转换。在Ruby中,无论是“真”和“假”是true,所以你需要使用的东西来强制转换价值与您的问题

或者

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

def use_user_data? 
    use_user_data == 'true' 
end 
+0

也许do | order | order.validates? – brabertaser19

+0

当然,编辑答案。 – dimuch

0

您需要将您的:if:unless条件置于lambda或Proc中。

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

这导致针对:use_user_data检查直到上述validates线被验证期间执行到不能评价(该Proc被作为值到:if:unless选项于由导轨进行评价传递)。 Proc将接收当前模型属性作为参数,允许您检查这些属性(在这种情况下,:use_user_datafalse

相关问题