2012-01-31 9 views
7

tengo los siguientes modelos:estilos que solicitan condicionalmente a paperclip adjuntos en 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 

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 

Estoy tratando de aplicar un estilo condicional , basado en la selección hecha desde un menú desplegable en el formulario. Simplemente no estoy seguro de dónde se implementa la decisión sobre qué estilo se debe elegir.

¿Pensamientos?

Rishi

Respuesta

15

Parece que usted está tratando de que se base en el valor category_id en el modelo Post, es así? Si es así, puede pasar una lambda como el valor de la entrada :styles en sus opciones de archivo adjunto, que incluye el archivo adjunto como un atributo.

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" 

El attachment es un objeto Paperclip::Attachment, y llamando al método instance en él devuelve la instancia de modelo.

Luego, en su método decide_style, puede basarlo en el valor category_id de su modelo según sea necesario.

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

Gracias Matt! Desde entonces he resuelto el problema, pero su enfoque es bueno. – frishi

Cuestiones relacionadas