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

fri*_*shi 7 forms ruby-on-rails paperclip

我有以下型号:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我试图有条件地应用一种风格,基于从表格下拉菜单中做出的选择.我只是不确定应该选择哪种风格的决定在哪里实施.

思考?

仙人

Mat*_*ins 15

看起来你正试图将它建立category_idPost模型的价值上,是吗?如果是这样,您实际上可以将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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)