Рассмотрим следующие отношения между родителями и детьми, когда Родитель равен 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_*
методов, а не для других?
Кто-нибудь еще ударил стеной с этим? Нужна ли здесь какая-то церемония, которую я пропустил, чтобы выполнить эту работу, особенно в отношении названий моделей?