[英]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. attachment
是Paperclip::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.