Rails3: вложенная модель - дочерний метод validates_with приводит к «NameError - неинициализированная константа [parent] :: [child]» - PullRequest
3 голосов
/ 28 ноября 2010

Рассмотрим следующие отношения между родителями и детьми, когда Родитель равен 1..n с детьми (здесь только соответствующий материал) ...

 class Parent < ActiveRecord::Base

   # !EDIT! - was missing this require originally -- was the root cause!
   require "Kid"

   has_many :kids, :dependent => :destroy, :validate => true
   accepts_nested_attributes_for :kids

   validates_associated :kids

 end

 class Kid < ActiveRecord::Base

   belongs_to :parent

   # for simplicity, assume a single field:  @item
   validates_presence_of :item, :message => "is expected"

 end

Методы validates_presence_of в модели Kid работают, как и ожидалось, при ошибке валидации, генерируя окончательную строку Item is expected для предоставленного атрибута пользовательского сообщения.

Но если попытаться validates_with, вместо ...

 class Kid < ActiveRecord::Base

   belongs_to :parent

   validates_with TrivialValidator

 end

 class TrivialValidator

   def validate
      if record.item != "good"
        record.errors[:base] << "Bad item!"
      end
   end

 end

... Rails возвращает ошибку NameError - uninitialized constant Parent::Kid не только после попытки создания (первоначального сохранения) пользовательских данных, но и даже при попытке создания начальной формы. Соответствующие биты от контроллера:

def new
 @parent = Parent.new
 @parent.kids.new # NameError, validates_* methods called within
end

def create
 @parent = Parent.new(params[:parent])
 @parent.save # NameError, validates_* methods called within
end

Ошибка предполагает, что где-то во время разрешения имени модели (и, возможно, имени поля?) Для создания сообщения об ошибке что-то не сработало. Но почему это может произойти для некоторых validates_* методов, а не для других?

Кто-нибудь еще ударил стеной с этим? Нужна ли здесь какая-то церемония, которую я пропустил, чтобы выполнить эту работу, особенно в отношении названий моделей?

1 Ответ

0 голосов
/ 29 ноября 2010

Через несколько часов и возвращение свежего - Отсутствует require "Kid" в Parent классе.Буду редактировать.

...