2010-08-14 4 views
3

Je viens de commencer à utiliser paperclip et j'ai un processeur personnalisé. J'ai mis le nouveau processeur dans l'emplacement correct RAILS_ROOT/lib/paperclip_processors Mais, il ne se charge pas.Les processeurs Paperclip ne sont pas chargés dans Rails 3.0.0rc

La raison de ne pas charger, est que Rails.root est nul au moment où est chargé. Je l'ai testé cela en mettant le code explicite dans le paperclip.rb

puts "What is Rails.root? #{Rails.root} #{Rails.root.nil?}" 

if defined?(Rails.root) && Rails.root 
    Dir.glob(File.join(File.expand_path(Rails.root), "lib", "paperclip_processors", "*.rb")).each do |processor| 
    require processor 
    end 
end 

qui imprimera What is Rails.root true. Et les processeurs ne sont jamais chargés.

Y a-t-il un correctif ou une solution pour cela? Le travail autour de maintenant est juste d'ajouter un besoin pour notre processeur. mais cela ne semble pas juste. Voici le travail autour de (notre processeur ne tar'ing), dans le modèle qui utilisera le processeur, juste besoin au sommet:

require "#{Rails.root}/lib/paperclip_processors/tar.rb" 

class Ad < ActiveRecord::Base 
    has_attached_file :adzip, 
       :styles   => { :targzip => {:processors => [:tar], :format => 'tgz'} } 
end 

Répondre

4

je devais inclure le répertoire paperclip_processors

module Trunk 
class Application < Rails::Application 

Paperclip::Railtie.insert 

# Custom directories with classes and modules you want to be autoloadable. 
config.autoload_paths += %W(#{Rails.root}/lib) 
config.autoload_paths += %W(#{Rails.root}/lib/paperclip_processors) 
end 
end 

Mais j'ai toujours un problème où il ne charge pas la classe dans cropper.

Expected /Users/jspooner/Dropbox/active/local.active.com/rails3/trunk/lib/paperclip_processors/cropper.rb to define Cropper 

cropper.rb

module Paperclip 
    class Cropper < Thumbnail 
    def transformation_command 
     if crop_command 
     crop_command + super[1..super.length] 
     else 
     super 
     end 
    end 

    def crop_command 
     target = @attachment.instance 
     if target.cropping? 
     " -crop '#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}'" 
     end 
    end 
    end 
end 
+2

lorsque vous ajoutez un 'autoload_paths' il attend que d'être la racine des modules pour les classes. Puisque vous mettez dans le répertoire paperclip, il saute cette partie du module. On attend donc juste de la classe Cropper, au lieu du module Paperclip de la classe Cropper. – christophercotton

+0

Merci christophercotton. Pour développer son commentaire, vous devez créer un autre dossier nommé "paperclip" dans le dossier "paperclip_processors". La raison en est, comme l'indique Chris, que la hiérarchie des modules encapsulant les classes définies que vous incluez doit correspondre à la structure du dossier. Donc, puisque la classe Cropper est sous le module Paperclip, vous avez besoin de paperclip de dossier pour correspondre au module Paperclip. Et puisque vous spécifiez le chemin "lib/paperclip_processors" dans votre config, tout doit passer sous cela. –