【问题标题】:"missing required :bucket option" for Paperclip/S3Paperclip/S3 的“缺少必需的:bucket 选项”
【发布时间】:2013-07-25 16:41:32
【问题描述】:

在我的 Rails 应用程序中,我允许用户在创建“发布”时上传图像,并且它应该直接上传到 S3。我在开发和生产中都遇到了以下错误。

编辑:我应该注意,尝试从表单提交的发布编辑页面上传时会发生此错误。

ArgumentError in ReleasesController#update

missing required :bucket option
Rails.root: /Users/jasondemeuse/pressed

我之前在使用 Carrierwave 时没有遇到任何问题,但现在我使用的是 Paperclip,我无法弄清楚我做错了什么。我在 SO 和其他地方看到的所有修复都是 heroku 问题,但我在开发中遇到了同样的问题,并且没有一个修复有帮助。

这是相关代码(“...”表示不相关的sn-ps):

development.rb

Appname::Application.configure do

...

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => 'http',
    :s3_credentials => {
      :bucket => ENV['AWS_BUCKET'],
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }
end

production.rb

Appname::Application.configure do

...

  config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => 'http',
    :s3_credentials => {
      :bucket => ENV['AWS_BUCKET'],
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }
end

release.rb

class Release < ActiveRecord::Base
  attr_accessible ... :banner


  belongs_to :user


  has_attached_file :banner, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>',
    spread: '1200x200'
  }

  has_many :banners, :dependent => :destroy
  accepts_nested_attributes_for :banners, :allow_destroy => true


end

show.html.erb

<%= image_tag @release.banner.url(:medium) %>
<%= @release.banner.url %>

// Have both of these in for now to see if they work, but since the upload isn't working it's giving me the missing.png

_form.html.erb

<%= f.label "Add A Banner?" %><br />
<%= f.file_field :banner %>

heroku 配置(在 .bash_profile 中有相同的开发)

AWS_ACCESS_KEY_ID:            XXXXXXXXXXXXXXXX
AWS_BUCKET:                   appname
AWS_SECRET_ACCESS_KEY:        XXXXXXXXXXXXXXXXXXXXXXXXXXX

编辑:这也是我的控制器的相关部分

  def update
    @release = Release.find(params[:id])


    respond_to do |format|
      if @release.update_attributes(params[:release])
        format.html { redirect_to [@user,@release], notice: 'Release was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @release.errors, status: :unprocessable_entity }
      end
    end
  end

我知道这应该非常简单,而且我确定我只是忘记了一些明显的事情,但我一直在检查 this walkthrough 以及我找到的修复程序,但似乎没有任何效果。是否有我忘记运行的 rake 任务或捆绑包?

提前谢谢你!

编辑 2: 以下答案对我有很大帮助,切换到 fog gem 为我解决了大部分问题。以防其他人遇到同样的问题,我也遇到了另一个让我感到困惑的问题。如果您遇到 heroku 问题和Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):,请确保您运行heroku rake db:migrate,然后使用heroku restart 重新启动heroku。我加载了我的架构并错误地认为我不需要这样做。

上述can be found here的SO答案。

【问题讨论】:

  • 你用的是什么版本的回形针?
  • 3.4.2 - 我的 Gemfile 中有 gem "paperclip", "~&gt; 3.0"
  • 我想尝试的一件事是运行AWS_BUCKET=appname rails server,看看你是否仍然收到错误。
  • 另外,问题是否出现在您的开发环境和 heroku 上,或者您是否仅在您的开发环境中进行了测试?
  • 它以同样的方式发生在开发和生产/heroku 上,我想这就是为什么我认为这是我忽略的一个明显的愚蠢错误。

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


【解决方案1】:

将此添加到模块和类中的 application.rb 文件中。创建一个local_env.yml 文件并将您的环境变量放在那里。此代码将在服务器启动时加载您的环境变量:

config.autoload_paths += %W(#{config.root}/lib)
config.before_configuration do
    env_file = File.join(Rails.root, 'config', 'local_env.yml')
    YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value
    end if File.exists?(env_file)
end

【讨论】:

    【解决方案2】:

    在我的情况下,我使用的是工头 (Heroku),它使用 .env 文件来存储环境变量。所以,当我做rake db:migrate 时,它找不到ENV['AWS_ACCESS_KEY_ID']

    我为运行迁移所做的只是暂时将我的 AWS 凭证直接添加到 Carrierwave 配置块中,然后在之后删除它们...

    这不是一个永久的解决方案,因为下次迁移时它会说同样的话......

    有关永久解决方案,请参阅:Use environment variables in Rake task

    它说使用:foreman run rake some_task 这样所有在 .env 中定义的变量也会为rake 任务加载

    【讨论】:

      【解决方案3】:

      我认为这是因为 :bucket 应该是传递给 Paperclip 而不是 S3 的选项。
      固定配置

        config.paperclip_defaults = {
          :storage => :s3,
          :s3_protocol => 'http',
          :bucket => ENV['AWS_BUCKET'],
          :s3_credentials => {
            :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
            :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
          }
        }
      

      Paperclip::Storage::S3 doc 似乎也证实了这一点,即使写得/格式如此糟糕。

      编辑:

      在我的一个项目中,我将 Paperclip 与 Fog gem 一起使用,效果很好

      Paperclip::Attachment.default_options.merge!(
        :storage => :fog,
        :fog_credentials => {
          :provider => 'AWS',
          :aws_access_key_id => ENV['S3_ACCESS_KEY_ID'],
          :aws_secret_access_key => ENV['S3_SECRET_ACCESS_KEY'],
          :region => 'eu-west-1' # in case you need it
        },
        :fog_directory => ENV['S3_BUCKET'], # only one of those is needed but I don't remember which
        :bucket => ENV['S3_BUCKET']
      )
      

      【讨论】:

      • 不幸的是,这似乎没有改变,我根据heroku walkthrough for paperclip将它包含在s3_credentials中。我将对其进行更多研究,也许该演练中的某些内容不正确?感谢您的帮助!
      • 在我看来,你应该坚持使用 Paperclip 的自述文件,而不是一些不知道有多久的 Heroku 指南。
      • 它是在四月发布/更新的,由 Thoughtbot 的开发人员编写,但是是的,我也看过 Paperclip 自述文件。
      • 前段时间我花了我的公平份额与这个作斗争;)
      • 我本来建议将存储桶移到 s3_credentials 哈希之外,但是如果您查看 s3 存储选项的来源,任何一种格式都是有效的。所以这不是问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多