Sinatra + Paperclip:未定义的方法`后代'

时间:2014-09-25 21:07:22

标签: ruby sinatra paperclip rack

我目前正在将一个非常小的Rails应用程序转换为Sinatra。这个Rails应用程序依赖 ActiveRecord + Paperclip + Amazon S3 进行图片存储,我在Sinatra工作时遇到了麻烦(但我相信对于任何类型的基于Rack的应用程序都是一样的) ,还有ActiveRecord + Paperclip + Amazon S3。

这是我到目前为止所拥有的:

的Gemfile:

gem 'paperclip'
gem 'paperclip-rack', require: 'paperclip/rack'
gem 'aws-sdk'

型号:

class Photo < ActiveRecord::Base
  include Paperclip::Glue 
  has_attached_file :image,
                    :storage => :s3,
                    :s3_credentials => "config/s3.yml",
                    :bucket => 'mybucket',
                    :path => ':style/:photo_id.:extension',
                    :styles => {
                      :original => '1200x1200>',
                      :miniature => '80x80#',
                      :slideshow => 'x200'
                    }

end

查看:

form method="post" action="/photos/add" enctype='multipart/form-data'
  input type="file" name="image"
  input#submit-button type="submit"

路线/动作:

  post '/photos/add' do
    photo = Photo.new
    photo.image = params[:image]
      #image[:tempfile]     = params[:image][:tempfile],
      #image[:filename]     = params[:image][:filename],
      #image[:content_type] = params[:image][:type],
      #image[:size]         = params[:image][:tempfile].size
    photo.save

    redirect "/"
  end

我在尝试上传内容时遇到的错误:

NoMethodError at /admin/photos/add
undefined method `descendants' for Paperclip::Validators::AttachmentFileNameValidator:Class
file: attachment.rb location: each line: 393

我尝试在我的路线中使用:image参数(并手动将每个值分配给由回形针创建的字段,请参阅注释行)但它似乎没有更好的效果。伙计们好吗?我陷入困境,不知道从哪里开始工作。

注意:我已删除所有验证和内容,因此我甚至不理解我收到的错误消息。

2 个答案:

答案 0 :(得分:1)

我(想)我能够使用这个SO答案修补#descendants方法:

Look up all descendants of a class in Ruby

所以我在我的一个初始化程序中修补了Paperclip,这似乎对我好,因为我不关心验证附件的内容类型:

module Paperclip
  module Validators
    class AttachmentFileNameValidator
      def self.descendants
        ObjectSpace.each_object(Class).select { |klass| klass < self }
      end
    end
    class AttachmentContentTypeValidator
      def self.descendants
        ObjectSpace.each_object(Class).select { |klass| klass < self }
      end
    end
    class AttachmentFileTypeIgnoranceValidator
      def self.descendants
        ObjectSpace.each_object(Class).select { |klass| klass < self }
      end
    end
  end
end

我使用的是Paperclip 4.2和Sinatra 1.4.5

答案 1 :(得分:0)

使用Paperclip的非Rails应用程序没有官方支持。请参阅有关它的讨论here

如果您查看Paperclip::Validators::AttachmentFileNameValidator:Class,您会注意到:

class AttachmentFileNameValidator < ActiveModel::EachValidator
  def initialize(options)
    options[:allow_nil] = true unless options.has_key?(:allow_nil)
    super
  end

ActiveModel捆绑了w / rails,因此我猜测它在这里爆炸了继承。无论哪种方式,我都会转移到像carrierwave

这样对Sinatra友好的上传者