2011-10-19 2 views
2

私はクリップを使用してサイズ変更された画像をアップロードしています。そのうちの1つは5つの方法のうちの1つが切り取られたいと思っています...とにかく、手作業でそれらを変更することによって、すべての文字列が見えるはずのものを作りましたが、今は、Paperclipのモデル化のための変数文字列の指定Imagemagikのサイズ変更

...ユーザーが望んでいる時に、問題は、私は

undefined local variable or method `params' for #<Class:0x00000105b228d8> 

取得しています、私は私の意志にレールを曲げしようとしてるので、私はこれがあることをかなり確信して感じていることです。とにかく、私は何をしようとしているのかははっきりしていると思います... crop_geometry_thumb変数をconvert_optionsに指定してください...私のモデルが実際にそれを見つけることができるこのロジックをどこに置くべきですか?

class Asset < ActiveRecord::Base 
    if params[:crop_geometry] == "bottom" 
    crop_geometry_thumb = "-crop 200x100+0+100 -scale 100x100" 
    elsif params[:crop_geometry] == "top" 
    crop_geometry_thumb = "-crop 200x100+0+0 -scale 100x100" 
    elsif params[:crop_geometry] == "left" 
    crop_geometry_thumb = "-crop 100x200+0+100 -scale 100x100" 
    elsif params[:crop_geometry] == "right" 
    crop_geometry_thumb = "-crop 100x200+100+0 -scale 100x100" 
    else 
    crop_geometry_thumb = "-scale 100x100" 
    end 

    belongs_to :piece 
    has_attached_file :asset, :styles => { 
    :large => ['700x700', :jpg], 
    :medium => ['300x300>', :jpg], 
    :thumb => ["200x200>", :jpg]}, 
    :convert_options => {:thumb => crop_geometry_thumb}, ### supply a string from above... FAIL :(
    :path => ":id/:style/:filename", 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :s3_permissions => :private, 
    :url => ':s3_domain_url' 
end 

答えて

3

だから、当面の問題は、そのリクエストパラメータ(すなわちparams[:crop_geometry]が)あなたのモデルに、あなただけのコントローラ+ビューにアクセスすることはできませんです。いくつかのケースでは

(それは本当に良いアイデアことはないが)、あなたはメソッドの引数としてモデルにのparamsを渡すことによって、このMVCのルールを回避することができます

class FoosController < ApplicationController 

    def action 
    Foo.some_method(params) 
    end 
end 

class Foo < ActiveRecord::Base 

    some_method(params) 
    puts params[:crop_geometry] 
    end 
end 

代わりに、私はお勧めしますモデルで定義されたインスタンス変数にそのPARAM情報を渡し、およびカスタムsetterメソッドに条件ロジックを入れて、そのように:あなたは、それは「トップを割り当てるようにフォームを変更する必要があります

class Asset < ActiveRecord::Base 
    attr_reader :crop_geometry 

    def crop_geometry=(crop_type) 
    if crop_type == "bottom" 
    crop_string = "-crop 200x100+0+100 -scale 100x100" 
    elsif crop_type == "top" 
     crop_geometry_thumb = "-crop 200x100+0+0 -scale 100x100" 
    elsif crop_type == "left" 
     crop_geometry_thumb = "-crop 100x200+0+100 -scale 100x100" 
    elsif crop_type == "right" 
     crop_geometry_thumb = "-crop 100x200+100+0 -scale 100x100" 
    else 
     crop_geometry_thumb = "-scale 100x100" 
    end 
    @crop_geometry = crop_geometry_thumb 
    end 
end 

注意'、' bottom '、またはparams [:asset] [:crop_geometry]には何でも。

crop_geometryを動的に設定するには、モデルが最初にロードされたときだけでなく、設定にアクセスするたびに評価されるように、has_attached_file設定でラムダを使用する必要があります。ここに行く:

has_attached_file :asset, :styles => lambda {|attachment| 
    :large => ['700x700', :jpg], 
    :medium => ['300x300>', :jpg], 
    :thumb => ["200x200>", :jpg]}, 
    :convert_options => {:thumb => attachment.instance.crop_geometry}, 
    :path => ":id/:style/:filename", 
    ... 
} 

https://github.com/thoughtbot/paperclipからその最後の部分を手に入れた(「動的設定」を探してください)。

+0

Thanks Sam!私はそれを今遊んでいるし、私はそれを働かせることができるかどうかを見ている。私は実際に私が実際に知っている誰かをここに見て驚いていると言わざるを得ない。 – counterbeing

+0

ええ、私はあなたが質問に答えることの途中であることに気づいただけです。小さな世界! – sam1vp

+1

私は最後にここに投稿して以来、私はこれに数時間を費やしました。私がこれに答えてマークしていない理由は、それがまだ私のために働いていないということです。ラムダを使ってコードを実行しようとすると、 "all:Symbol"のために "未定義のメソッド' instance 'が得られます。これは私に質問につながります、そのラムダのすべてのことについてのインスタンスの言葉は何ですか?私はPaperclipの例でそれを見ていますが、それでも私には意味がありません:/ – counterbeing

関連する問題