2012-09-01 2 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 действительно необходимо определить методы boolean Verkooporder? и Retourorder?, если они вам не нужны в другом месте.

UPDATE:

теперь я понимаю, что ваша форма будет возвращать order_type в виде строки в Order::ORDER_TYPES, которая не будет работать с проверкой выше, так как подтверждение выше проверка на целочисленных строк.

То, как я это делал в прошлом, - это не использовать целое число для order_type, а строку. В этом случае вы можете просто подтвердить с помощью validates_inclusion_of :order_type, :in => ORDER_TYPES, а раскрывающийся список выбора не должен изменяться. Есть ли какая-то конкретная причина, по которой вы используете целое значение для order_type? В качестве альтернативы вы можете выбрать значения целых чисел select для каждого типа заказа.

+0

Также попробуйте использовать новый стиль проверки Rails 3, если вы работаете с Rails 3.
validates :order_type, :inclusion => { :in => %w(0 1) } YaBoyQuy

Смежные вопросы