6

Voglio creare associazioni polimorfiche con graffetta e consentire al mio utente di avere un avatar e più immagini.rotaie 3 associazione polimorfica con graffetta e più modelli

Allegato modello:

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 

Modello utente:

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

dell'utente del controller:

def edit 
    @user.build_avatar 
end 

utente Visualizza modulo:

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

quando tento di salvare le modifiche ottengo l'errore => sconosciuto attributo: avatar

se mi tolgo la: class_name => 'attaccamento' nell'associazione has_one ottengo l'errore => inizializzata costante utente :: Avatar

ho bisogno di collegare anche gli avatar di post del blog, quindi ho bisogno l'associazione di essere polimorfico (o almeno penso così)

sono perplesso e qualsiasi aiuto sarebbe molto apprezzato.

risposta

6

Ho un progetto nelle opere che utilizza con successo Paperclip e associazioni polimorfiche. Lasciate che vi mostri quello che ho, e forse si può applicare al vostro progetto:

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 le canzoni e gli album modulo includono questo come una parziale:

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

don 't dimenticare di includere: html => {: multipart => true} con il modulo di

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 

e infine, un estratto da songs_controller.RB:

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

ahh proprio quello di cui avevo bisogno, grazie Brett! – kaigth

+0

@kaigth, scusami, ti ho dato una tale soluzione. Avrei dovuto iniziare con questo. Auguri. – Brett

+0

Gli stili per gli allegati nel modello Artwork possono essere diversi per Album e song in base alla relazione polimorfica? – ramkumar

0

Non sono sicuro che sia davvero necessario essere polimorfici. Che ne dici di questo approccio, che usa has_many: through? In inglese semplice, l'utente ha un avatar con più immagini e tramite questa associazione è possibile chiamare User.images per ottenere la raccolta di immagini associate all'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 

Detto tutto questo, io sono rimasto a chiedermi perché è necessario passare attraverso tutto questo comunque. Perché non fare semplicemente

class User < ActiveRecord::Base 
    has_many :avatars 
end 

che ti darebbe quante immagini (avatar) vuoi.

+0

questo è impressionante, ma voglio anche per fissare gli avatar a post del blog, quindi mi sarebbe ancora bisogno di usare le associazioni polimorfiche Messaggio :: Avatar – kaigth

+0

@kaigth vorresti non vogliono collegare gli utenti ai post del blog, e quindi prendi il loro avatar associato? – Brett

+0

@ Brett Voglio che le persone siano in grado di assegnare avatar separati per i post del blog, quindi i loro post possono essere unici invece di un avatar degli utenti – kaigth