Скрепка с MongoMapper в Rails 3 - PullRequest
3 голосов
/ 28 июля 2010

Я пытаюсь реализовать Paperclip в своем первом приложении rails, и мне приходится использовать rails 3 и mongodb с mongomapper.

Я следовал этому руководству , чтобы получить вещи длявсе работают вместе

Так же, как и в сообщении в блоге, я поместил скрепку в каталог config / initializers, я установил гем, гем находится в файле gem (rails 3 right), я запустил упаковщик.

В своем пользовательском классе я добавил

require 'paperclip'

Когда я загружаю приложение, я получаю следующую ошибку,

undefined method 'has_attached_file' for User:Class

Файл скрепки выглядит следующим образомэто

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

Есть какие-либо предложения о том, что я могу делать не так?я правильно понял шаги?

Ответы [ 4 ]

6 голосов
/ 06 февраля 2012

Начиная с MongoMapper 0.11.0, Paperclip 2.5.2 и Rails 3.0.4, все, что вам нужно:

#your model
require 'paperclip'

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

  has_attached_file :avatar

  key :avatar_file_name, String
end

Вам больше не нужен инициализатор Paperclip.

1 голос
/ 16 августа 2012

Я только что выпустил гем, чтобы позаботиться об этом после того, как приведенные выше фрагменты кода не совсем работали для более поздних версий скрепок и направляющих.

Проверьте mongomapper-paperclip

0 голосов
/ 16 марта 2011

Я думаю, у меня все получилось, но некоторые оригинальные решения не работали с недавно выпущенными версиями. Это решение работает для Rails 3.0.4, paperclip 2.3.8 и mongo_mapper 0.8.6:

модель:

# 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

инициализатор

# 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
0 голосов
/ 29 июля 2010

Оказывается, мне нужны оба

 
    include Paperclip
    require 'paperclip'

в файле user.rb.

Это приводит к ошибке, где vald? не был распознан, но я прокомментировал

# unless attachement.valid?

и теперь дела идут лучше.

...