2012-01-31 7 views
7

で添付ファイルをクリップするスタイルを適用する:条件付きで、私は次のモデルを持っているのRails 3.1

Post.rb

class Post < ActiveRecord::Base 

    belongs_to :category 
    has_many :attachments, :dependent => :destroy 
    has_many :citations, :dependent => :destroy 

    validates :title, :category_id, :content, :presence =>true 

    acts_as_taggable_on :keywords 
    accepts_nested_attributes_for :attachments, :allow_destroy => true, 
     :reject_if => proc { |attributes| attributes['photo'].blank?} 
    accepts_nested_attributes_for :citations, :allow_destroy=>true 

end 

をAttachment.rb

class Attachment < ActiveRecord::Base 

    belongs_to :post 

    has_attached_file :photo, :styles => { :medium => "637x471>", 
       :thumb => Proc.new { |instance| instance.resize }, 
       :carousel => Proc.new { |instance| instance.decide_style } 
       }, 
       :url => "/pictures/:style/:basename.:extension", 
       :path =>":rails_root/public/pictures/:style/:basename.:extension" 


    validates_attachment_content_type :photo, :content_type => ['image/png', 'image/jpg', 'image/jpeg']     
    validates_attachment_size :photo, :less_than => 2.megabytes   


    ### End Paperclip #### 
    def decide_style 

    # catid = Post.find(param[:post_category_id]) 
    # something here to get the selection from the form. 

     if(catid == 2) 
     # "400x800>" or custom style here 
     end 

     end 


def resize  
geo = Paperclip::Geometry.from_file(photo.to_file(:original)) 

ratio = geo.width/geo.height 

min_width = 142 
min_height = 119 

if ratio > 1 
    # Horizontal Image 
    final_height = min_height 
    final_width = final_height * ratio 
    "#{final_width.round}x#{final_height.round}!" 
else 
    # Vertical Image 
    final_width = min_width 
    final_height = final_width * ratio 
    "#{final_height.round}x#{final_width.round}!" 
    end 
end 

end 

私は条件付きスタイルを適用しようとしていますフォーム上のドロップダウンからの選択に基づいています。私は、どのようなスタイルを選択すべきかについての決定がどこで実施されているかについては分かりません。

思考?あなたはPostモデルにcategory_id値に、それをベースにしようとしているよう

リシ

答えて

15

はそれが見え、その権利はありますか?その場合は、添付ファイルを属性として含む添付ファイルオプションの:stylesエントリの値として実際にラムダを渡すことができます。

has_attached_file :photo, 
    :styles => lambda { |attachment| { 
     :medium => "637x471>", 
     :thumb => attachment.instance.resize, 
     :carousel => attachment.instance.decide_style, 
    } }, 
    :url => "/pictures/:style/:basename.:extension", 
    :path =>":rails_root/public/pictures/:style/:basename.:extension" 

attachmentPaperclip::Attachmentオブジェクトであり、その上にinstanceメソッドを呼び出すと、お使いのモデルインスタンスを返します。

decide_styleメソッドでは、モデルのcategory_idの値を必要に応じてベースにすることができます。

def decide_style 
    case category_id 
    when 1 then "200x400>" 
    when 2 then "400x800>" 
    else "50x50#" 
    end 
end 
+0

ありがとうございました!私はそれ以来問題を解決しましたが、あなたのアプローチは良いものです。 – frishi

関連する問題