有条件地将样式应用于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

附件.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值的基础上,对吗?如果是这样的话,您实际上可以在附件选项中传递一个lambda作为: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"

attachment是一个Paperclip::Attachment对象,对其调用instance方法将返回模型实例。

然后在decide_style方法中,可以根据需要基于模型的category_id值。

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

最新更新