我有一个Active
模型(您可以将其视为一个活动用户),它具有使用Devise进行身份验证的设置。我正在尝试向photograph
模型添加Active
属性,并能够使用S3上传图片。
迁移:
class AddAttachmentPhotographToActives < ActiveRecord::Migration
def self.up
change_table :actives do |t|
t.attachment :photograph
end
end
def self.down
drop_attached_file :actives, :photograph
end
end
活跃型号:
...
has_attached_file :photograph,
:styles => { :medium => "300x300>", :thumb => "100x100>" },
:storage => :s3,
:default_url => '/images/:attachment/missing_:style.png',
:path => "users/:id/photograph/:style.:extension",
:bucket => ... ,
:s3_credentials => {
:access_key_id => " ... ",
:secret_access_key => " ... "
}
config/environments/production.rb
和config/environments/development.rb
都有以下内容:
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => ENV[' ... '],
:access_key_id => ENV[' ... '],
:secret_access_key => ENV[' ... ']
}
}
我的表单上传了views/devise/registrations/edit.html.erb
中的图片,如下所示:<%= f.file_field :photograph %>
。但是,在我使用此表单选择并更新Active后(更新成功完成),我的图像的路径(使用<%= image_tag @active.photograph.url %>
生成)是:
http://localhost:3000/images/photographs/missing_original.png
而不是S3地址。
另请注意我使用以下宝石:
gem "paperclip", "~> 3.0"
gem 'aws-sdk'
我之前从未使用过S3,但在我选择要上传的图片并在我的更新页面上点击“enter”后,我在亚马逊门户网站上的S3存储桶仍为空,因此更新从未通过。
我没有正确设置吗?
答案 0 :(得分:0)
您的代码看起来很好 - 您确定S3设置正确吗?
以下是我们使用的代码 - 希望这会有所帮助:
#app/models/image.rb
Class Image < ActiveRecord::Base
has_attached_file :image,
:styles => { :medium => "x300", :thumb => "x100" },
:default_url => "***********",
:storage => :s3,
:bucket => '*********',
:s3_credentials => S3_CREDENTIALS
end
#config/initializers/s3.rb
if Rails.env == "production"
# set credentials from ENV hash
S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "firststop"}
else
# get credentials from YML file
S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end
#config/s3.yml
development:
access_key_id: **************
secret_access_key: ***************
bucket: *******
这对我们来说很好用
答案 1 :(得分:0)
请勿在代码中保留这些密钥。至少,在config / environment.rb文件中放置信用号:
S3_KEY='myKey'
S3_SECRET='mySecret'
#etc.
然后在您的代码中将它们引用为S3_KEY等
有关此方法和相关方法的更多信息:How do I store keys for API's in Rails?