2

モデルで包含検証を機能させるのに苦労しているので、ここで何が欠けているか教えてくれる人がいるかもしれません。

これは私が持っているモデルです:

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 }
  ...

また、次のような定数配列を使用してドロップダウン ボックスを作成するフォームも作成しました。

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

そして、次のようにモデルに保存します。

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

そのため、注文モデルを保存すると、常に order_type の検証に失敗します。私が間違っていることを指摘できる人はいますか?

PS: 私のモデルの order_type は整数値フィールドです。

4

1 に答える 1

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 }

この場合、他の場所で必要でない限り、ブール値Verkooporder?とメソッドを定義する必要はありません。Retourorder?

アップデート:

上記の検証は整数値の文字列で検証しているため、上記の検証では機能しませorder_typeん。Order::ORDER_TYPES

過去にこれを行った方法は、整数ではorder_typeなく文字列を使用することです。その場合、 で検証するだけでよくvalidates_inclusion_of :order_type, :in => ORDER_TYPES、選択ドロップダウンを変更する必要はありません。に整数値フィールドを使用している特定の理由はありますorder_typeか? あるいは、注文タイプごとに select が整数値を返すようにすることもできます。

于 2012-09-02T00:27:26.750 に答える