2012-09-01 111 views
2

我很努力得到一個包含驗證在模型上工作,所以也許有人可以告訴我我在這裏失蹤。Rails包含驗證

這是我的模型有:

class Order < ActiveRecord::Base 

    ORDER_TYPES = %w{ Verkooporder Retourorder } 

    ORDER_TYPES.each_with_index do |meth, index| 
    define_method("#{meth}?") { type == index } 
    end 
    validates_inclusion_of :order_type, :in => %w{ Verkooporder Retourorder } 
    ... 

我還創建了創建使用常量數組這樣的dropdownbox形式: (我

= f.input :order_type, as: :select, collection: Order::ORDER_TYPES, label: 'Order type', include_blank: false 

我保存它我的模型是這樣的:

@order.order_type = params[:order][:order_type] 

因此,當我保存我的訂單模型時,它總是失敗o n驗證order_type。 有沒有人能指出我做錯了什麼?

PS:order_type是我模型中的一個整數值字段。

回答

1

的問題是,您所定義的方法Verkooporder?Retourorder?,但他們沒有因爲:in被解釋爲%w{ Verkooporder Retourorder}字符串數組從您的驗證調用,即[ "Verkooporder", "Retourorder"]

你真正想驗證那是什麼order_type是和0之間的數字ORDER_TYPES數組的大小,即用0和1之間的值的字符串:

validates_inclusion_of :order_type, :in => %w{ 0 1 } 

在這種情況下,你不」 t確實需要定義布爾型Verkooporder?Retourorder?方法,除非您在別處需要它們。

UPDATE:

我現在認識到你的形式將返回order_typeOrder::ORDER_TYPES一個字符串,它不會因爲以上驗證以上的整數值串驗證驗證工作。

我過去的做法是不使用整數而是字符串order_type。在這種情況下,您只需使用validates_inclusion_of :order_type, :in => ORDER_TYPES進行驗證,並且選擇下拉列表不必更改。 order_type是否有任何特殊原因使用整數值字段?或者,您可以爲每個訂單類型選擇返回整數值。

+0

如果您正在使用Rails 3,請嘗試使用新的Rails 3驗證樣式。
validates :order_type, :inclusion => { :in => %w(0 1) } YaBoyQuy