简体   繁体   English

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

[英]Conditionally applying styles to paperclip attachments in Rails 3.1

I have the following models: 我有以下型号:

Post.rb 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 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

I am trying to conditionally apply a style, based on the selection made from a drop down on the form. 我试图有条件地应用一种风格,基于从表格下拉菜单中做出的选择。 I am just not sure as to where the decision as to what style should be chosen is implemented. 我只是不确定应该选择哪种风格的决定在哪里实施。

Thoughts? 思考?

Rishi 仙人

It looks like you're trying to base it upon the category_id value on the Post model, is that right? 看起来你试图将它建立在Post模型的category_id值上,是吗? If so, you can actually pass a lambda as the value of the :styles entry in your attachment options, which includes the attachment as an attribute. 如果是这样,您实际上可以将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"

The attachment is a Paperclip::Attachment object, and calling the instance method on it returns your model instance. attachmentPaperclip::Attachment对象,并在其上调用instance方法返回您的模型实例。

Then in your decide_style method, you can base it upon your model's category_id value as needed. 然后在您的decide_style方法中,您可以根据需要将其基于模型的category_id值。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM