在Rails 3.1中有条理地将样式应用于回形针附件

我有以下型号:

Post.rb

class Post  :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  { :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" 

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