2012-01-31 3 views
7

ho i seguenti modelli:stili condizionale che si applicano a graffetta allegati in 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 

sto cercando di applicare uno stile condizionale , in base alla selezione effettuata da un menu a discesa nel modulo. Non sono sicuro di dove sia implementata la decisione su quale stile debba essere scelto.

Pensieri?

Rishi

risposta

15

Sembra che si sta cercando di basarlo sul valore category_id sul modello Post, è giusto? In tal caso, puoi effettivamente passare una lambda come valore della voce :styles nelle opzioni dell'allegato, che include l'allegato come attributo.

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" 

Il attachment è un oggetto Paperclip::Attachment, e chiamando il metodo instance su di esso restituisce l'istanza del modello.

Quindi, nel metodo decide_style, è possibile basarlo sul valore category_id del modello in base alle esigenze.

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

Grazie Matt! Da allora ho risolto il problema, ma il tuo approccio è buono. – frishi