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

在我的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 ', square: '200x200#', medium: '300x300>', spread: '1200x200' } has_many :banners, :dependent => :destroy accepts_nested_attributes_for :banners, :allow_destroy => true end 

show.html.erb

   // 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

 

heroku config(在.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 

我知道这应该是非常简单的,我确信我只是忘记了一些明显的东西,但我一直在讨论这个演练以及我发现的修复工具,似乎没有任何工作。 是否有我忘记运行的rake任务或捆绑或什么?

先感谢您!

编辑2:以下答案帮助了我很多,并切换到foggem固定大多数东西给我。 为了防止其他人遇到这些相同的问题,我还遇到了另一个让我感到困惑的问题。 如果你有heroku问题和Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):确保你运行heroku rake db:migrate然后用heroku restart启动heroku。 我加载了我的架构,错误地认为我不需要这样做。

可以在此处找到上述答案。

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

在我的例子中,我使用的是foreman(Heroku),它使用.env文件来存储环境变量。 所以,当我做rake db:migrate它无法找到ENV['AWS_ACCESS_KEY_ID']

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

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

有关永久解决方案,请参阅: 在Rake任务中使用环境变量

其中说使用: foreman run rake some_task这样,.env中定义的所有变量也被加载到rake任务中

将其添加到模块和类内的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