2

私は次の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>

何かご意見は?

4

2 に答える 2

0

この同じ問題に遭遇しました。回避策を見つけましたが、これを処理するためのより良い方法があるかどうかはまだ疑問です.

于 2013-05-07T16:33:46.080 に答える
0

私は通常これを行います

  version :thumb, :if => :thumb_version_enabled? do
    process :resize_to_fit => [100, 100]
  end

  version :big, :if => :big_version_enabled? do
    process :resize_to_fill => [600,600]
  end

  def include_version?(v)
    if self.model.respond_to?("only_versions")
      self.model.only_versions.collect(&:to_s).include? v.to_s
    else
      true
    end
  end

  protected 

  def method_missing(method_name, *args, &block)
    return super unless /^(.*)_version_enabled(=?)/ =~ method_name
    return include_version?(method_name.to_s.gsub("_version_enabled?","").gsub("_version_enabled",""))
  end

ターゲット モデル (アップローダーがマウントされている場所) で、有効なバージョンを定義するメソッドを定義します。

class Product < ActiveRecord::Base

  ##....omiss
  mount_uploader :image, ImageUploader

  def self.only_versions
    [:thumb, :big, :small, :original]
  end

  def only_versions
    self.class.only_versions
  end
end

ポリモーフィックな関連付けの場合、メソッドを関連付けられたモデルに委任できます

class Image < ActiveRecord::Base
  mount_uploader :data, ImageUploader

  belongs_to :imageable, :polymorphic => true

  def only_versions
    if self.imageable && self.imageable.respond_to?("only_versions")
      self.imageable.only_versions
    else
      ImageUploader.versions.keys
    end
  end

メソッド「only_versions」が欠落している場合、デフォルトですべてのバージョンが有効になっています...

于 2013-11-18T21:49:36.090 に答える