我试图在我的rails应用程序中使用paperclip设置Amazon S3存储。
我有一个名为“资产”的模型属于“用户”
以下是Asset.rb中的前几行
attr_accessible :user_id, :uploaded_file
belongs_to :user
#set up "uploaded_file" filed as attached_file(using paperclip)
has_attached_file :uploaded_file,
:path => "assets/:id/:basename.:extension",
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/amazon_s3.yml",
:bucket => "XXXXX"
validates_attachment_size :uploaded_file, :less_than => 1000.megabytes
validates_attachment_presence :uploaded_file
加载视图时出现错误:
NoMethodError in AssetsController#create
undefined method `symbolize_keys' for #<String:0x00000103939258>
这是什么意思。它与“Asset.rb”中的这一行有关 :s3_credentials =&gt; “#{Rails.root} /config/amazon_s3.yml”,
我在网上查了一下,有几个关于如何弃用Rails_ROOT的讨论,所以我使用了Rails.root。仍然有这个错误。
我还将AWS密钥和密码存储在amazon_s3.yml配置文件中。
这不是最好的做法,所以如果有人有任何其他想法,我很乐意听到。 heroku在他们的网站上说将变量作为环境变量,但是,我不知道如何在heroku上设置它,以及当我在我的本地开发机器上时呢?这会怎么样?
我只是有点困惑,所以想看看那里是否有完整的示例或教程。所有我能找到的都是弃用的设置......
由于
答案 0 :(得分:2)
它对我有用(根据你的情况采用):
#Asset.rb
has_attached_file :uploaded_file, {
:path => "assets/:id/:basename.:extension"
}.merge(PAPERCLIP_STORAGE_OPTIONS)
#environments/development.rb and test.rb
PAPERCLIP_STORAGE_OPTIONS = {
:storage => :s3,
:bucket => "XXXX",
:s3_credentials => YAML.load_file("#{Rails.root}/config/s3_credentials.yml")
}
#environments/production.rb
PAPERCLIP_STORAGE_OPTIONS = {
:storage => :s3,
:bucket => ENV['S3_BUCKET_NAME'],
:s3_credentials => {
:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
}
}
#config/s3_credentials.yml
access_key_id: "XXXX"
secret_access_key: "XXXX"
请注意
s3_credetials.yml
添加到.gitignore
。ENV
个变量:https://devcenter.heroku.com/articles/s3 PAPERCLIP_STORAGE_OPTIONS
的值更改为{ }
。然后文件将存储在本地(例如,用于测试)。这个问题帮助我解决了问题:How can I set paperclip's storage mechanism based on the current Rails environment?
偏离主题,但它可能有用:如果您想阅读文件 - @asset.uploaded_file.s3_object.read