我目前正在将一个非常小的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
参数(并手动将每个值分配给由回形针创建的字段,请参阅注释行)但它似乎没有更好的效果。伙计们好吗?我陷入困境,不知道从哪里开始工作。
注意:我已删除所有验证和内容,因此我甚至不理解我收到的错误消息。
答案 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友好的上传者