rails 3 polymorphic association with paperclip and multiple models
paperclip, polymorphic-associations, ruby-on-rails, ruby-on-rails-3
Solution
I do have a project in the works that is successfully using Paperclip and polymorphic associations. Let me show you what I have, and maybe you can apply it to your project:
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
the songs form and the albums form include this as a partial:
<div class="field">
<%= f.fields_for :artwork do |artwork_fields| %>
<%= artwork_fields.label :artwork %><br />
<%= artwork_fields.file_field :artwork %>
<% end %>
don't forget to include :html => { :multipart => true } with the form
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
and finally, an excerpt from songs_controller.rb:
def new
@song = Song.new
@song.build_artwork
end
Problem
I want to make polymorphic associations with paperclip, and allow my user to have one avatar and multiple images. Attachment model: ``` 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 ``` User Model: ``` has_one :avatar, :as => :attachable, :class_name => 'Attachment', :conditions => {:type => 'avatar'} accepts_nested_attributes_for :avatar ``` User Controller: ``` def edit @user.build_avatar end ``` User View form: ``` <%= 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 %> ``` when I attempt to save the changes I get the error => unknown attribute: avatar if I remove the :class_name => 'attachment' in the has_one association I get the error => uninitialized constant User::Avatar I need to also attach avatars to blog posts, so I need the association to be polymorphic (or atleast i think so) I am stumped and any help would be greatly appreciated.