2013-07-25 22 views
11

在我的Rails应用程序我让用户上传图片时,他们创造了“释放”,它应该直接上传到S3。我在开发和生产中遇到以下错误。“缺少必需的:斗选项”的回形针/ 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 

发布.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以及我找到的修复和似乎没有任何工作。是否有一个耙子任务或束我忘了跑或什么?

预先感谢您!

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

甲SO与上述can be found here回答。

+0

您正在使用什么版本的回形针? – gregates

+0

3.4.2 - 我在Gemfile中有gem“paperclip”,“〜> 3.0”'。 – Jason

+0

我猜想有一件事是尝试运行'AWS_BUCKET = appname rails server'并查看是否仍然出现错误。 – gregates

回答

19

我认为这是因为:bucket应该传给不回形针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::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

这似乎并没有作出改变不幸的是,我把它包含在s3_credentials根据[回形针的heroku演练](https://devcenter.heroku.com/articles/paperclip-s3)。我会更深入地研究它,也许在那个演练中有些不正确?谢谢你的帮助! – Jason

+0

在我看来,你应该坚持回形针的自述,而不是一些Heroku指南,这是没有人知道多大年纪。 –

+0

它在四月发布/更新并由Thoughtbot的开发人员编写,但是我也看过Paperclip自述文件。 – Jason

0

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

我所做的运行我的迁移我暂时将我的AWS凭据directlñy到Carrierwave配置块,然后在他们之后删除...

这是不是因为你旁边迁移,它会说同样的事情时长久之计...

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

它说使用:foreman run rake some_task这种方式.ENV中定义的所有变量都加载了rake任务

0

将此添加到模块和类中的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 
相关问题