【问题标题】:Rails: AWS S3 + Paperclip : Getting NoMethodError in AssetsController#createRails:AWS S3 + Paperclip:在 AssetsController#create 中获取 NoMethodError
【发布时间】:2012-06-17 06:47:15
【问题描述】:

我正在尝试在我的 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 上进行设置,以及我在本地开发机器上的情况如何?这将如何运作?

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

谢谢

【问题讨论】:

  • 你调用create的回溯/地方是什么样子的?

标签: ruby-on-rails amazon-web-services paperclip


【解决方案1】:

它对我的工作方式(根据您的情况采用):

#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. 确定,您在 heroku 中添加了 ENV 变量:https://devcenter.heroku.com/articles/s3
  3. 您可以将PAPERCLIP_STORAGE_OPTIONS 的值更改为{ }。然后文件将存储在本地(例如,用于测试)。

这个问题帮助我解决了问题:How can I set paperclip's storage mechanism based on the current Rails environment?

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

【讨论】:

  • 您好,感谢您的出色回答。我有一个问题:我之前的“environments/development.rb”中有这一行:“Paperclip.options[:command_path] = “/usr/local/bin/”” 我应该添加您建议的行:“PAPERCLIP_STORAGE_OPTIONS = {......} 在此行之后或替换它。谢谢
  • 这不起作用。我收到此错误“路由错误未初始化常量 Asset::PAPERCLIP_STORAGE_OPTIONS”
  • 添加之前或之后:没关系。我刚刚重新检查:同样适用于我。您是否尝试过重新启动服务器?确保您在配置中写入了相同的常量名称,或者您启动了哪个环境,或者您将配置放在哪里......标准调试过程。但我不知道你为什么得到routing error。这很奇怪,可能这里有错误。
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多