2013-01-16 86 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

相關問題