Ruby on Rails - Comment déléguer les messages d'erreur du modèle imbriqué

class User
  include Mongoid::Document

  has_many :images
  accepts_nested_attributes_for :image
end


class Image
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paperclip

  has_mongoid_attached_file :uploaded_image,
    :path => ":rails_root/public/uploads/:class/:id/:basename.:extension",
    :url => "public/uploads/"
    validates_attachment_content_type :uploaded_file, :content_type => "application/png", :message => "error massage"
     belongs_to :user
    delegate :url, :path, to: :uploaded_image, allow_nil: true, prefix: false
end

Comment déléguer des erreurs d'Image à Utilisateur si: uploaded_image n'est pas valide?

Par exemple:

user_image = user.images.build(uploaded_image: new_image.path)
user_image.save

Il devrait y avoir une erreur si upload_image n'est pas valide.

0

1 Réponses

Rails a l'aide validates_associated (également disponible dans Mongoid) qui appellera valid? sur chacun des objets associés.

Le message d'erreur par défaut pour validates_associated est "is invalid".   Notez que chaque objet associé contiendra ses propres erreurs   collection; les erreurs ne se propagent pas jusqu'au modèle appelant.

     

Guides Rails: validations d'enregistrements actifs

class User
  include Mongoid::Document

  has_many :images
  accepts_nested_attributes_for :image
  validates_associated :images
end

Note that you should not add validates_associated :user to Image since it would cause an infinite loop.

Vous pouvez accéder aux erreurs pour les images imbriquées comme suit:

<% if @user.errors.any? %>
  <div id="error_explanation">
    

<%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:

    
    <% @user.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • <% end %>
    <% if @user.images.any? %>
    
    <% @user.images.each do |image| %><% if image.errors.any? %>
    • <% image.errors.full_messages.each do |msg| %>
    • <%= msg %>
    • <% end %>
  • <% end %><% end %>
    <% end %>
  </div>
<% end %>
0
ajouté