【问题标题】:Rails 4 + Paperclip + Devise + S3: Images not uploading to S3?Rails 4 + Paperclip + Devise + S3:图像未上传到 S3?
【发布时间】:2014-01-18 23:41:30
【问题描述】:

我有一个 Active 模型(您可以将 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 中上传图片的表单,如下所示:&lt;%= f.file_field :photograph %&gt;。但是,在我使用此表单选择并更新 Active 后(更新成功),我的图像的路径(使用 &lt;%= image_tag @active.photograph.url %&gt; 生成)是:

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

而不是 S3 地址。

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

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

我以前从未使用过 S3,但是在我选择要上传的图像并在我的更新页面上点击“输入”后,我在 Amazon 门户上的 S3 存储桶仍然是空的,因此更新没有通过。

我没有正确设置吗?

【问题讨论】:

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


    【解决方案1】:

    您的代码看起来不错 - 您确定您的 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: *******
    

    这对我们很有效

    【讨论】:

    • 啊,好吧,这是我的 Active 模型中的一些东西搞砸了——:photograph 不是允许的属性。谢谢!还有一个更快速的问题:将 S3 凭证推送到版本控制方面的常见做法是什么?我应该在我的 .gitignore 中添加什么?
    【解决方案2】:

    不要将这些键留在您的代码中。至少,将凭据放在 config/environment.rb 文件中:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 2023-03-29
      • 2019-07-14
      • 1970-01-01
      • 2015-10-29
      • 2012-02-22
      相关资源
      最近更新 更多