0

我试图在我的 rails 应用程序中使用回形针设置 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 =>“#{Rails.root}/config/amazon_s3.yml”,

我在网上查阅了一些关于如何弃用 Rails_ROOT 的讨论,所以我改用 Rails.root。仍然收到此错误。

我还将 AWS 密钥和秘密密码存储在 amazon_s3.yml 配置文件中。

这不是最佳实践,所以如果有人有任何其他想法,我很想听听。heroku 在他们的网站上说将变量作为环境变量,但是,我不确定如何在 heroku 上设置它,以及我在本地开发机器上的时候呢?那将如何运作?

我只是有点困惑,所以看看那里是否有完整的示例或教程。我能找到的只是不推荐使用的设置......

谢谢

4

1 回答 1

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"

请注意

  1. 添加s3_credetials.yml.gitignore.
  2. 请确保,您ENV在 heroku 中添加了变量:https ://devcenter.heroku.com/articles/s3
  3. 您可以将 的值更改PAPERCLIP_STORAGE_OPTIONS{ }。然后文件将存储在本地(例如,用于测试)。

这个问题帮助我解决了问题:如何根据当前的Rails环境设置回形针的存储机制?

题外话,但它可能有用:如果你想阅读文件 -@asset.uploaded_file.s3_object.read

于 2012-06-17T13:12:03.843 回答