Jas*_*son 11 ruby-on-rails heroku amazon-s3 paperclip
在我的Rails应用程序中,我让用户在创建"发布"时上传图像,并且应该直接上传到S3.我在开发和生产中都遇到以下错误.
编辑:我应该注意,尝试从表单提交上的发布编辑页面上传时会发生此错误.
ArgumentError in ReleasesController#update
missing required :bucket option
Rails.root: /Users/jasondemeuse/pressed
Run Code Online (Sandbox Code Playgroud)
我以前做过这个没有使用过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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
_form.html.erb
<%= f.label "Add A Banner?" %><br />
<%= f.file_field :banner %>
Run Code Online (Sandbox Code Playgroud)
heroku config(在.bash_profile中用于开发)
AWS_ACCESS_KEY_ID: XXXXXXXXXXXXXXXX
AWS_BUCKET: appname
AWS_SECRET_ACCESS_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的控制器的相关部分
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
Run Code Online (Sandbox Code Playgroud)
我知道这应该是非常简单的,我确信我只是忘记了一些明显的东西,但我一直在讨论这个演练以及我发现的修复,似乎没有任何工作.是否有我忘了运行的rake任务或捆绑或什么?
先感谢您!
编辑2:以下答案帮助了我很多,切换到fog宝石修复了大多数东西给我.为了防止其他人遇到这些相同的问题,我也遇到了另一个让我感到困惑的问题.如果你有heroku问题和a Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):,请确保你运行heroku rake db:migrate然后重启heroku heroku restart.我加载了我的架构,错误地认为我不需要这样做.
可以在此处找到上述答案.
Mik*_*del 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']
}
}
Run Code Online (Sandbox Code Playgroud)
而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']
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6561 次 |
| 最近记录: |