Nie chcę zakładać nowego tematu, wiec napiszę tu:
Mam problem z walidacją powyższych modeli.
[code=ruby]params = { media_object: { resource: { content: “foo” }, title: “foobar”, type: :text }}
media = MediaObject.new(params[:media_object])
media.valid? #=> false
media.errors #=> #<ActiveModel::Errors:0x007f809d249aa8 @messages={:resource=>[“jest nieprawidłowe”]}>
media.resource.errors #=> #<ActiveModel::Errors:0x007f809d4c52f0 @messages={:content=>[“jest za krótkie (minimalnie 5 znaków)”]}>[/code]
jak zmusić MediaObject, żeby w errors wyświetlał pełne wiadomości errorów z resource? Teraz nijak nie chce działać wyświetlanie błędów w formularzu:
[code=haml]= semantic_form_for @media_object do |f|
= f.semantic_errors
= f.input :title
= f.input :type, as: :hidden, value: @media_object.type
= f.semantic_fields_for :resource do |r|
= r.input :content, as: :text
= f.buttons[/code]
[code=ruby]# MediaObject
class MediaObject
include Mongoid::Document
#== Resource relation
embeds_one :resource, class_name: ‘Media::Resource’
after_initialize :build_proper_resource
def build_proper_resource
if type
self.resource = Media::Resource.build_proper_resource(type, self)
end
end
end
Media::Resource
class Media::Resource
include Mongoid::Document
#== MediaObject relation
embedded_in :media_object
def self.build_proper_resource(type, media_object)
klass = media_object.class.media_types[type].constantize
media_params, resource_params = media_object.attributes, (media_object.resource.try(:attributes) || {})
klass_params = media_params.merge(resource_params).symbolize_keys.slice(*klass.allowed_fields.map(&:to_sym))
klass.new(klass_params)
end
end[/code]
media_types to hash:
{ text: 'Media::Text', image: 'Media::Image' }
class Media::Text < Media::Resource
field :content, type: String
validates :content, presence: true, length: { minimum: 5 }
end
po wysłaniu formularza, pojawiają się tylko błędy tytułu:
http://img607.imageshack.us/img607/180/zrzutekranu2012012o1534.png