6

Je veux faire des associations polymorphes avec un trombone, et permettre à mon utilisateur d'avoir un avatar et plusieurs images.rails 3 association polymorphique avec un trombone et plusieurs modèles

Pièce jointe Modèle:

class Attachment < ActiveRecord::Base 
belongs_to :attachable, :polymorphic => true 
end 

class Avatar < Attachment 
has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

class Image < Attachment 
has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

Modèle utilisateur:

has_one :avatar, :as => :attachable, :class_name => 'Attachment', :conditions => {:type => 'avatar'} 
accepts_nested_attributes_for :avatar 

Controller User:

def edit 
    @user.build_avatar 
end 

formulaire de vue utilisateur:

<%= form_for @user, :html => { :multipart => true } do |f| %> 

    <%= f.fields_for :avatar do |asset| %> 
     <% if asset.object.new_record? %> 
      <%= asset.file_field :image %> 
     <% end %> 
    <% end %> 

lorsque je tente d'enregistrer les modifications que je reçois l'erreur => attribut inconnu: avatar

si je retire le: class_name => « attachement » dans l'association has_one je reçois l'erreur => uninitialized utilisateur constante :: Avatar

Je dois aussi attacher des avatars à bloguer messages, donc je dois l'association polymorphes (i ou du moins le pense)

Je suis perplexe et toute aide serait grandement appréciée.

Répondre

6

J'ai un projet en cours qui utilise avec succès des associations Paperclip et polymorphes. Laissez-moi vous montrer ce que j'ai, et vous pouvez peut-être appliquer à votre projet:

class Song < ActiveRecord::Base 
    ... 
    has_one :artwork, :as => :artable, :dependent => :destroy 
    accepts_nested_attributes_for :artwork 
    ... 
end 

class Album < ActiveRecord::Base 
    ... 
    has_one :artwork, :as => :artable, :dependent => :destroy 
    accepts_nested_attributes_for :artwork 
    ... 
end 

class Artwork < ActiveRecord::Base 
    belongs_to :artable, :polymorphic => true 
    attr_accessible :artwork_content_type, :artwork_file_name, :artwork_file_size, :artwork 

    # Paperclip 
    has_attached_file :artwork, 
    :styles => { 
     :small => "100", 
     :full => "400" 
    } 

    validates_attachment_content_type :artwork, :content_type => 'image/jpeg' 
end 

la forme de chansons et les albums formulaire comprennent cela comme une partie:

<div class="field"> 
<%= f.fields_for :artwork do |artwork_fields| %> 
    <%= artwork_fields.label :artwork %><br /> 
    <%= artwork_fields.file_field :artwork %> 
<% end %> 

don « oubliez pas d'inclure: html => {: multipart => true} avec la forme

artworks_controller.rb

class ArtworksController < ApplicationController 
    def create 
    @artwork = Artwork.new(params[:artwork]) 

    if @artwork.save 
     redirect_to @artwork.artable, notice: 'Artwork was successfully created.' 
    else 
     redirect_to @artwork.artable, notice: 'An error ocurred.' 
    end 
    end 
end 

et enfin, un extrait de songs_controller.rb:

def new 
    @song = Song.new 
    @song.build_artwork 
end 
+0

ahh juste ce dont j'avais besoin, merci Brett! – kaigth

+0

@kaigth, désolé je vous ai donné une telle approximation. Je devrais juste commencer avec ça. Meilleurs vœux. – Brett

+0

Les styles pour les pièces jointes dans le modèle Artwork peuvent-ils être différents pour l'album et la chanson en fonction de la relation polymorphique? – ramkumar

0

Je ne suis pas sûr que vous ayez vraiment besoin d'être polymorphe. Que diriez-vous de cette approche, qui utilise has_many: through? En langage clair, l'utilisateur a un avatar qui a plusieurs images, et grâce à cette association, vous pouvez appeler User.images pour obtenir la collection d'images associée à l'avatar.

http://guides.rubyonrails.org/association_basics.html

class User < ActiveRecord::Base 
    has_one :avatar 
    has_many :images, :through => :avatar 
end 

class Avatar < ActiveRecord::Base 
    belongs_to :user 
    has_many :images 
end 

class Image < ActiveRecord::Base 
    belongs_to :avatar 
    has_attached_file :image, :styles => { :thumb => "150x150>", :view => "260x180>" }, 
end 

Après avoir dit tout cela, je me demande bien pourquoi vous avez besoin de passer par tout cela de toute façon. Pourquoi ne pas simplement faire

class User < ActiveRecord::Base 
    has_many :avatars 
end 

qui vous donnerait autant d'images (avatars) que vous le souhaitez.

+0

des thats génial, mais je veux aussi attacher des avatars à bloguer messages, donc je encore besoin d'utiliser des associations polymorphiques :: Poster Avatar – kaigth

+0

@kaigth ne voudriez-vous pas de connecter les utilisateurs aux messages blog et Ensuite, prenez leur avatar associé? – Brett

+0

@ Brett Je veux que les gens puissent assigner des avatars séparés pour les billets de blog, ainsi leurs messages peuvent être uniques au lieu d'un avatar – kaigth

Questions connexes