Почему этот метод 'validate' вызывает ArgumentError? - PullRequest
3 голосов
/ 12 мая 2011

Люди,

Я не могу заставить validates_with в моем (helloworld-y) приложении rails работать. Прочитайте раздел «обратные вызовы и валидаторы» оригинального сайта руководств RoR и выполнили поиск в stackoverflow, но ничего не нашли.

Вот урезанная версия кода, которую я получил после удаления всего, что может дать сбой.

class BareBonesValidator < ActiveModel::Validator
  def validate    
    # irrelevant logic. whatever i put here raises the same error - even no logic at all
  end
end

class Unvalidable < ActiveRecord::Base
  validates_with BareBonesValidator
end

Похоже на пример из учебника, верно? У них очень похожий фрагмент на направляющих RoR . Затем мы идем к rails console и получаем ArgumentError при проверке новой записи:

ruby-1.9.2-p180 :022 > o = Unvalidable.new
 => #<Unvalidable id: nil, name: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p180 :023 > o.save
ArgumentError: wrong number of arguments (1 for 0)
    from /Users/ujn/src/yes/app/models/unvalidable.rb:3:in `validate'
    from /Users/ujn/.rvm/gems/ruby-1.9.2-p180@wimmie/gems/activesupport-3.0.7/lib/active_support/callbacks.rb:315:in `_callback_before_43'

Я знаю, что что-то упустил, но что?

(Примечание: чтобы не помещать BareBonesValidator в отдельный файл, я оставил его поверх model/unvalidable.rb).

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Функция validate должна принимать запись в качестве параметра (иначе вы не сможете получить к ней доступ в модуле).Он отсутствует в руководстве, но официальный документ правильный.

class BareBonesValidator < ActiveModel::Validator
  def validate(record)
    if some_complex_logic
      record.errors[:base] = "This record is invalid"
    end
  end
end

Редактировать: И он уже исправлен в направляющей края .

1 голос
/ 12 мая 2011

Ошибка ArgumentError: wrong number of arguments (1 for 0) означает, что метод validate был вызван с аргументом 1, но метод был определен для получения 0 аргументов.

Итак, определите ваш validate метод, как показано ниже, и попробуйте снова:

class BareBonesValidator < ActiveModel::Validator
  def validate(record) #added record argument here - you are missing this in your code
    # irrelevant logic. whatever i put here raises the same error - even no logic at all
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...