私は次の3つのモデルを持っています:
class Product < ActiveRecord::Base
has_many :images, :as => :imageable
end
class Category < ActiveRecord::Base
has_many :images, :as => :imageable
end
class Image < ActiveRecord::Base
mount_uploader :image, ImageUploader
belongs_to :imageable, :polymorphic => true
end
私の画像コントローラーは次のようになります。
class Admin::ImagesController < AdminController
before_filter :find_imageable
def new
@image = @imageable.images.new
end
def create
if @image = @imageable.images.create(params[:image])
redirect_to admin_images_path(:imageable_type => @imageable.class, :imageable_id => @imageable.id)
else
render 'new'
end
end
private
def find_imageable
klass = params[:imageable_type].capitalize.constantize
@imageable = klass.find(params[:imageable_id])
end
end
すべてが期待どおりに機能していますが、関連付けの種類に応じて画像のサイズを変更したいと思います。
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :file
version :thumb, :if => :is_product? do
process :resize_to_fill => [100, 100]
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
protected
def is_product? image
model.imageable.class == 'Product' # => imageable is nil!
end
end
問題は、「モデル」がアップローダのイメージ可能オブジェクトと関連付けられていないことです。モデルを調べると、次のようになります。
#<Image id: nil, name: "test", image: nil, imageable_id: nil, imageable_type: nil, created_at: nil, updated_at: nil>
何かご意見は?