6

Quiero hacer asociaciones polimórficas con clip, y permitir que mi usuario tenga un avatar y múltiples imágenes.rails 3 asociación polimórfica con clip y modelos múltiples

Adjunto modelo:

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 

usuario Modelo:

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

Usuario del Controlador:

def edit 
    @user.build_avatar 
end 

usuario Ver formulario:

<%= 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 %> 

cuando intento para guardar los cambios que consigo el error => atributo desconocido: avatar

Si quito el: class_name => 'apego' en la asociación has_one consigo el error => usuario constante sin inicializar :: Avatar

necesito adjuntar también los avatares de las entradas del blog, así que necesito la asociación a ser polimórficos (o al menos eso creo)

estoy perplejo y cualquier ayuda sería muy apreciada.

Respuesta

6

Tengo un proyecto en las obras que está utilizando con éxito Paperclip y asociaciones polimórficas. Te voy a enseñar lo que tengo, y tal vez se puede aplicar a su proyecto:

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 

forma canciones y los álbumes forman incluir esto como una parcial:

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

Don 't olvides incluir: html => {: multipart => true} con la forma

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 

y, por último, un extracto de songs_controller.RB:

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

ahh justo lo que necesitaba, ¡gracias Brett! – kaigth

+0

@kaigth, lo siento, te di una gran vuelta. Debería haber empezado con esto. Los mejores deseos. – Brett

+0

¿pueden los estilos de los archivos adjuntos en el modelo de Artwork ser diferentes para el álbum y la canción en función de la relación polimórfica? – ramkumar

0

No estoy seguro de que realmente deba ser polimorfo. ¿Qué tal este enfoque, que usa has_many: through? En inglés simple, el usuario tiene un avatar que tiene múltiples imágenes, y a través de esta asociación puede llamar a User.images para obtener la colección de imágenes asociadas con el 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 

Una vez dicho todo esto, yo me quedo a preguntarse por qué tiene que pasar por todo esto de todos modos. ¿Por qué no simplemente hacer

class User < ActiveRecord::Base 
    has_many :avatars 
end 

que le daría tantas imágenes (avatares) como desee.

+0

eso es impresionante, pero también quieren colocar los avatares de las entradas del blog, por lo que tendrían que seguir utilizar asociaciones polimórficas Post :: Avatar – kaigth

+0

@kaigth qué no quiere adjuntar a los usuarios las entradas del blog, y luego agarrar su avatar asociado? – Brett

+0

@ Brett Quiero que las personas puedan asignar avatares separados para publicaciones de blog, por lo que sus publicaciones pueden ser únicas en lugar de avatar de un usuario – kaigth

Cuestiones relacionadas