7

ペーパークリップとポリモーフィックな関連付けを行い、ユーザーが1つのアバターと複数の画像を持つことができるようにしたい。

アタッチメントモデル:

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 =>'attachment'を削除すると、エラー=> uninitialized constant User::Avatarが発生します

ブログの投稿にもアバターを添付する必要があるので、関連付けは多形である必要があります(または少なくとも私はそう思います)

私は困惑しており、どんな助けでも大歓迎です。

4

2 に答える 2

7

ペーパークリップと多形の関連付けをうまく使用しているプロジェクトがあります。私が持っているものをお見せしましょう。多分あなたはそれをあなたのプロジェクトに適用することができます:

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}を含めることを忘れないでください

アートワーク_コントローラー.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
于 2012-05-16T18:24:29.577 に答える
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

これにより、必要な数の画像(アバター)が得られます。

于 2012-05-15T20:17:51.280 に答える