6

私はpaperclipと多相関連を作り、1人のアバターと複数の画像を持つことができます。rails 3ペーパークリップと複数のモデルとの多形関連

添付モデル:

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 

ユーザーモデル:

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

ユーザーコントローラー:

def edit 
    @user.build_avatar 
end 

ユーザービュー形式:

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

私は、エラー=>未知の属性を取得し、変更を保存しよう:アバター

私は削除する場合:has_oneの関連でCLASS_NAME =>「添付ファイルを」私は、エラー=> 初期化されていない一定のユーザーを取得します私は困惑していますし、任意の助けをいただければ幸いです

::アバター

私も記事をブログにアバターを添付する必要があるので、私は多型であることを関連付けを必要とする(あるいは、少なくとも、私はそう思います)。

答えて

6

私は、Paperclipとポリモーフィックな関連付けをうまく使っている作品があります。私は私が持っているものをお見せしましょう、と多分あなたは、あなたのプロジェクトに適用することができます。

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 

曲形成し、アルバムは部分としてこれを含める形成:

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

ドン含めることを忘れないでください:html => {:multipart => true}フォームに

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 

最後に、songs_controllerの抜粋。RB:

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

ああ、ちょうど私が必要なもの、ブレットに感謝! – kaigth

+0

@kaigth、申し訳ありません、私はあなたにそのような回り道を与えました。私はこれで始めるべきだった。ご多幸を祈る。 – Brett

+0

Artworkモデルの添付ファイルのスタイルは、多形関係に基づいてアルバムと曲で異なることができますか? – ramkumar

0

本当はポリモーフィックである必要があるかどうかはわかりません。このアプローチは、has_many:throughを使用するのはどうでしょうか?簡単な英語では、ユーザーには複数の画像を持つ1つのアバターがあり、このアソシエーションを介してUser.imagesを呼び出してアバターに関連付けられた画像のコレクションを取得できます。

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 

このすべてを言って、私はあなたがすべてのこのとにかく通過する必要がなぜ不思議に残っています。なぜちょうどあなたが好きな多くの画像(アバター)を与えるだろう

class User < ActiveRecord::Base 
    has_many :avatars 
end 

をしません。

+0

のthats素晴らしいが、私も記事をブログにアバターを添付したいので、私はまだあなたが記事をブログにユーザーを添付したいとは思わないでしょうポリモーフィック団体ポスト::アバター – kaigth

+0

@kaigthを使用する必要があるでしょう、と関連付けられたアバターをつかみますか? – Brett

+0

@ Brett私は人々がブログ記事のために別々のアバターを割り当てることができるようにしたいので、ユーザーのアバターの代わりに投稿をユニークにすることができます – kaigth

関連する問題