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?and 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作为 in 中的字符串返回Order::ORDER_TYPES,这不适用于上面的验证,因为上面的验证正在验证整数值字符串。

我过去这样做的方式不是使用整数,order_type而是使用字符串。在这种情况下,您只需使用 验证validates_inclusion_of :order_type, :in => ORDER_TYPES,选择下拉菜单不必更改。您使用整数值字段是否有任何特殊原因order_type?或者,您可以让 select 返回每个订单类型的整数值。

于 2012-09-02T00:27:26.750 回答