Rails 4 + Paperclip + Devise + S3:图片无法上传到S3?

时间:2014-01-01 10:01:51

标签: ruby-on-rails devise amazon-s3 paperclip

我有一个Active模型(您可以将其视为一个活动用户),它具有使用Devise进行身份验证的设置。我正在尝试向photograph模型添加Active属性,并能够使用S3上传图片。

迁移:

class AddAttachmentPhotographToActives < ActiveRecord::Migration
  def self.up
    change_table :actives do |t|
      t.attachment :photograph
    end
  end

  def self.down
    drop_attached_file :actives, :photograph
  end
end

活跃型号:

...

has_attached_file :photograph,
  :styles => { :medium => "300x300>", :thumb => "100x100>" },
  :storage => :s3,
  :default_url => '/images/:attachment/missing_:style.png',
  :path => "users/:id/photograph/:style.:extension",
  :bucket => ... ,
  :s3_credentials => {
    :access_key_id => " ... ",
    :secret_access_key => " ... "
  }

config/environments/production.rbconfig/environments/development.rb都有以下内容:

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_credentials => {
      :bucket => ENV[' ... '],
      :access_key_id => ENV[' ... '],
      :secret_access_key => ENV[' ... ']
    }
  }

我的表单上传了views/devise/registrations/edit.html.erb中的图片,如下所示:<%= f.file_field :photograph %>。但是,在我使用此表单选择并更新Active后(更新成功完成),我的图像的路径(使用<%= image_tag @active.photograph.url %>生成)是:

http://localhost:3000/images/photographs/missing_original.png

而不是S3地址。

另请注意我使用以下宝石:

gem "paperclip", "~> 3.0"
gem 'aws-sdk'

我之前从未使用过S3,但在我选择要上传的图片并在我的更新页面上点击“enter”后,我在亚马逊门户网站上的S3存储桶仍为空,因此更新从未通过。

我没有正确设置吗?

2 个答案:

答案 0 :(得分:0)

您的代码看起来很好 - 您确定S3设置正确吗?

以下是我们使用的代码 - 希望这会有所帮助:

#app/models/image.rb
Class Image < ActiveRecord::Base
    has_attached_file :image,
           :styles => { :medium => "x300", :thumb => "x100" },
           :default_url => "***********",
           :storage => :s3,
           :bucket => '*********',
           :s3_credentials => S3_CREDENTIALS
end

#config/initializers/s3.rb
if Rails.env == "production"
  # set credentials from ENV hash
  S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "firststop"}
else
  # get credentials from YML file
  S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end

#config/s3.yml
development:
  access_key_id: **************
  secret_access_key: ***************
  bucket: *******

这对我们来说很好用

答案 1 :(得分:0)

请勿在代码中保留这些密钥。至少,在config / environment.rb文件中放置信用号:

S3_KEY='myKey'
S3_SECRET='mySecret'
#etc.

然后在您的代码中将它们引用为S3_KEY等

有关此方法和相关方法的更多信息:How do I store keys for API's in Rails?