2010-07-27 4 views
3

J'essaie d'implémenter Paperclip dans ma première application rails, et j'utilise justement les rails 3 et mongodb avec mongomapper.Paperclip avec MongoMapper dans Rails 3

J'ai suivi this guide à obtenir là des choses à travailler ensemble

Tout comme le billet de blog suggère, je l'ai mis paperclip dans le répertoire config/initializers, J'ai installé la pierre, la pierre précieuse est dans le Gemfile (rails 3 à droite), j'ai couru le bundler.

Dans ma classe d'utilisateurs, j'ai ajouté

require 'paperclip'

Quand je charge l'application, je reçois l'erreur suivante,

undefined method 'has_attached_file' for User:Class

Le fichier paperclip ressemble à ceci

module Paperclip 
    module ClassMethods 
    def has_attached_file name, options = {} 
     include InstanceMethods 

     write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil? 
     attachment_definitions[name] = {:validations => []}.merge(options) 

     after_save :save_attached_files 
     before_destroy :destroy_attached_files 

     define_callbacks :before_post_process, :after_post_process 
     define_callbacks :"before_#{name}_post_process", :"after_#{name}_post_process" 

     define_method name do |*args| 
     a = attachment_for(name) 
     (args.length > 0) ? a.to_s(args.first) : a 
     end 

     define_method "#{name}=" do |file| 
     attachment_for(name).assign(file) 
     end 

     define_method "#{name}?" do 
     attachment_for(name).file? 
     end 

     validates_each name, :logic => lambda { 
     attachment = attachment_for(name) 
     attachment.send(:flush_errors) unless attachment.valid? 
     } 
    end 
    end 

    module Interpolations 
    # Handle string ids (mongo) 
    def id_partition attachment, style 
     if (id = attachment.instance.id).is_a?(Integer) 
     ("%09d" % id).scan(/\d{3}/).join("/") 
     else 
     id.scan(/.{3}/).first(3).join("/") 
     end 
    end 
    end 
end 

Des suggestions sur ce que je peux faire de mal? est-ce que j'ai les étapes, n'est-ce pas?

Répondre

0

s'avère que je besoin à la fois

 
    include Paperclip 
    require 'paperclip' 

dans le fichier user.rb.

Cela conduit à une erreur où vald? n'a pas été reconnu, mais j'ai commenté

# unless attachement.valid?

et maintenant les choses vont mieux.

0

Je pense que je l'ai fonctionné mais certaines des solutions d'origine ne fonctionnaient pas avec les versions récemment publiées. Cette solution fonctionne pour Rails 3.0.4, 2.3.8 paperclip et mongo_mapper 0.8.6:

modèle

:

# app/models/entry_image.rb 
require 'paperclip' 

class EntryImage 
    include MongoMapper::Document 
    include Paperclip::Glue 

    has_attached_file :image, :styles => {:thumb => "25x25#"} 

    key :image_file_name, String 

end 

initialiseur

# config/initializers/mongo_paperclip.rb 
# Code originally from 
# http://anlek.com/2010/06/getting-paperclip-to-work-with-mongomapper/ 
# Additional changes to work with newer version of paperclip 
module Paperclip 
    class << self 
    def logger #:nodoc: 
     MongoMapper.logger 
    end 
    end 

    module ClassMethods 
    def has_attached_file name, options = {} 
     include InstanceMethods 

     write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil? 
     attachment_definitions[name] = {:validations => []}.merge(options) 

     after_save :save_attached_files 
     before_destroy :destroy_attached_files 

     define_callbacks :before_post_process, :after_post_process 
     define_callbacks :"before_#{name}_post_process", :"after_#{name}_post_process" 

     define_method name do |*args| 
     a = attachment_for(name) 
     (args.length > 0) ? a.to_s(args.first) : a 
     end 

     define_method "#{name}=" do |file| 
     attachment_for(name).assign(file) 
     end 

     define_method "#{name}?" do 
     attachment_for(name).file? 
     end 

     validates_each name, :logic => lambda {|record| 
     attachment = record.attachment_for(name) 
     attachment.send(:flush_errors) 
     } 
    end 
    end 

    module Interpolations 
    # Handle string ids (mongo) 
    def id_partition attachment, style 
     if (id = attachment.instance.id).is_a?(Integer) 
     ("%09d" % id).scan(/\d{3}/).join("/") 
     else 
     id.scan(/.{3}/).first(3).join("/") 
     end 
    end 
    end 
end 
6

Au MongoMapper 0.11.0, Paperclip 2.5 .2 et Rails 3.0.4, tout ce que vous avez besoin est:

#your model 
require 'paperclip' 

class User 
    include MongoMapper::Document 
    include Paperclip::Glue 

    has_attached_file :avatar 

    key :avatar_file_name, String 
end 

vous n'avez pas besoin d'un initialiseur Paperclip plus.

1

Je viens de publier une gemme pour prendre soin de cela après que les extraits de code ci-dessus ne fonctionnaient pas tout à fait pour les versions ultérieures de trombones et de rails.

Découvrez mongomapper-paperclip

Questions connexes