使用Paperclip和Padrino

背景:我正在使用Padrino,Ruby 1.9.2,HAML和Heroku构建一个简单的博客。 我希望post索引具有杂志般的外观。 对于索引中的每个post,用户应该看到标题,内容摘要和图像。 我的问题是附加图像。

问题:我一直在尝试使用Paperclip gem将图像附加到每个post。 Heroku将从Amazon S3 bin中捕获实际图像。 到目前为止,当我尝试运行迁移时,我收到错误:

$ .../base.rb:1088:in `method_missing': undefined method `has_attached_file' for # (NoMethodError) 

看起来像Paperclip只是不会加载,但是我被卡住了。

详细信息: – 问:当我“尝试运行迁移”时,我在做什么? – 答:我将以下内容放入迁移文件夹中

 class AddPictureToPost < ActiveRecord::Migration def self.up change_table :posts do |t| t.has_attached_file :picture end end def self.down drop_attached_file :posts, :picture end end 

然后运行“padrino rake ar:migrate”

– 问:我是否在Gemfile中列出了Paperclip? – A:是的。

– 问:post模型是什么样的? – 一个:

 class Post  :s3, :bucket => 'blog_images', :s3_credentials => { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'] } end 

– 问:app.rb是什么样子的? – 一个:

 class Blog < Padrino::Application register Padrino::Rendering register Padrino::Mailer register Padrino::Helpers enable :sessions get '/' do haml :index end end 

– 问:boot.rb是什么样的? – 一个:

 PADRINO_ENV = ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= "development" unless defined?(PADRINO_ENV) PADRINO_ROOT = File.expand_path('../..', __FILE__) unless defined? (PADRINO_ROOT) require 'rubygems' unless defined?(Gem) require 'bundler/setup' Bundler.require(:default, PADRINO_ENV) Padrino.before_load do end Padrino.after_load do end Padrino.load! 

– 问:完整的错误输出是什么样的? – 一个:

 jared:~/blog$ padrino rake ar:migrate => Executing Rake ar:migrate ... /usr/local/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/ active_record/base.rb:1088:in `method_missing': undefined method `has_attached_file' for # (NoMethodError) from /home/jared/isthmus2/app/models/post.rb:2:in `' from /home/jared/isthmus2/app/models/post.rb:1:in `' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `block in require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `block in load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:640:in `new_constants_in' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/reloader.rb:148:in `safe_load' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:162:in `block in require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/application.rb:34:in `inherited' from /home/jared/blog/app/app.rb:1:in `' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `block in require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `block in load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:640:in `new_constants_in' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/reloader.rb:148:in `safe_load' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:162:in `block in require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/mounter.rb:148:in `locate_app_object' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/mounter.rb:30:in `initialize' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/mounter.rb:221:in `new' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/mounter.rb:221:in `mount' from /home/jared/blog/config/apps.rb:34:in `' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `block in require' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `block in load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:640:in `new_constants_in' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:223:in `load_dependency' from /usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/ active_support/dependencies.rb:240:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/reloader.rb:148:in `safe_load' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:162:in `block in require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:160:in `require_dependencies' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:70:in `block in load!' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:70:in `each' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/loader.rb:70:in `load!' from /home/jared/blog/config/boot.rb:29:in `' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/cli/base.rb:56:in `require' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/cli/base.rb:56:in `block in rake' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/cli/base.rb:140:in `capture' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/lib/ padrino-core/cli/base.rb:56:in `rake' from /usr/local/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/task.rb: 22:in `run' from /usr/local/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/ invocation.rb:118:in `invoke_task' from /usr/local/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor.rb: 263:in `dispatch' from /usr/local/lib/ruby/gems/1.9.1/gems/thor-0.14.6/lib/thor/base.rb: 389:in `start' from /usr/local/lib/ruby/gems/1.9.1/gems/padrino-core-0.10.5/bin/ padrino:9:in `' from /usr/local/bin/padrino:19:in `load' from /usr/local/bin/padrino:19:in `' 

如果你已经读过这么久了……谢谢! 我希望你能帮我解释一下。

Paperclip与rails无关,因此您需要在boot.rbPadrino.before_load

  ActiveRecord::Base.send(:include, Paperclip::Glue) File.send(:include, Paperclip::Upfile) Paperclip.options[:logger] = Padrino.logger 

最后要在heroku下运行迁移,你应该首先运行本地padrino rake gen这将创建一个Rakefile所以你应该能够简单地运行: heroku rake ar:migrate