私は Paperclip を使用して Ruby on Rails 用の画像アップロード コードを書いています。実用的なソリューションはありますが、非常にハックなので、より適切に実装する方法についてアドバイスをいただければ幸いです。Paperclip 添付ファイルを含むアップロードされた画像に関する情報を含む「Asset」クラスと、サイズ情報をカプセル化する「Generator」クラスがあります。各「プロジェクト」には複数のアセットとジェネレーターがあります。すべてのアセットは、各ジェネレーターで指定されたサイズに従ってサイズ変更する必要があります。したがって、各プロジェクトには、そのすべてのアセットが持つべき特定のサイズ セットがあります。
発電機モデル:
class Generator < ActiveRecord::Base
attr_accessible :height, :width
belongs_to :project
def sym
"#{self.width}x#{self.height}".to_sym
end
end
資産モデル:
class Asset < ActiveRecord::Base
attr_accessible :filename,
:image # etc.
attr_accessor :generators
has_attached_file :image,
:styles => lambda { |a| a.instance.styles }
belongs_to :project
# this is utterly horrendous
def styles
s = {}
if @generators == nil
@generators = self.project.generators
end
@generators.each do |g|
s[g.sym] = "#{g.width}x#{g.height}"
end
s
end
end
アセット コントローラの作成方法:
def create
@project = Project.find(params[:project_id])
@asset = Asset.new
@asset.generators = @project.generators
@asset.update_attributes(params[:asset])
@asset.project = @project
@asset.uploaded_by = current_user
respond_to do |format|
if @asset.save_(current_user)
@project.last_asset = @asset
@project.save
format.html { redirect_to project_asset_url(@asset.project, @asset), notice: 'Asset was successfully created.' }
format.json { render json: @asset, status: :created, location: @asset }
else
format.html { render action: "new" }
format.json { render json: @asset.errors, status: :unprocessable_entity }
end
end
end
私が抱えている問題は鶏卵の問題です。新しく作成されたアセットは、適切にインスタンス化されるまで、使用するジェネレーター (サイズ仕様) を認識しません。@project.assets.build を使用してみましたが、アセットがプロジェクトの関連付けセットを取得して nil アウトする前に、Paperclip コードが実行されます。
「if @generators == nil」ハックは、コントローラーでさらにハッキングしなくても更新メソッドが機能するようにするためのものです。
全体的にかなり気持ち悪いです。これをより賢明な方法で記述する方法、またはこの種のことを行うためのアプローチを提案できる人はいますか?
前もって感謝します!:)