Paperclip / S3的“缺少必需:桶选项”

时间:2013-07-25 16:44:30

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

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

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

ArgumentError in ReleasesController#update

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

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

以下是相关代码(“...”表示不相关的代码段):

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宝石为我修复了大部分内容。为了防止其他人遇到这些相同的问题,我也遇到了另一个让我感到困惑的问题。如果您遇到了heroku问题和Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):,请确保运行heroku rake db:migrate,然后使用heroku restart重新启动heroku。我加载了我的架构,错误地认为我不需要这样做。

上述can be found here的答案。

3 个答案:

答案 0 :(得分:19)

我认为这是因为: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 with 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']
)

答案 1 :(得分:0)

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

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

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

对于永久性解决方案,请参阅:Use environment variables in Rake task

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

答案 2 :(得分:0)

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

local_env.yml