Ruby on rails 轨道:AWS S3和x2B;回形针:在AssetController中获取命名错误#创建

Ruby on rails 轨道:AWS S3和x2B;回形针:在AssetController中获取命名错误#创建,ruby-on-rails,amazon-web-services,paperclip,Ruby On Rails,Amazon Web Services,Paperclip,我正在尝试在我的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, :

我正在尝试在我的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>
AssetController中的命名错误#创建 未定义的方法“符号化密钥”# 这意味着什么。它与“Asset.rb”中的这一行有关 :s3_credentials=>“#{Rails.root}/config/amazon_s3.yml”

我在网上查阅了一些关于Rails\u ROOT如何被弃用的讨论,因此我改用Rails.ROOT。仍然得到这个错误

此外,我还在amazon_s3.yml配置文件中存储AWS密钥和密码

这不是最好的做法,所以如果有人有任何其他想法,我很乐意听到他们。heroku在他们的网站上说要把这些变量作为环境变量,但是,我不确定我会如何在heroku上设置这些变量,当我在本地开发机器上时又会怎样呢?那怎么办

我只是有点困惑,所以想看看是否有一个完整的例子或教程的地方。我只能找到不推荐的设置

谢谢你,这对我来说是怎样的(适应了你的情况):

请注意

  • s3\u credetials.yml
    添加到
    .gitignore
  • 请确保,您在heroku中添加了
    ENV
    变量:
  • 您可以将
    回形针存储\u选项的值更改为
    {}
    。然后文件将存储在本地(例如,用于测试)
  • 这个问题帮助我解决了问题:


    脱离主题,但它可能很有用:如果您想读取文件-
    @asset.uploaded\u file.s3\u object.read

    您称为create的回溯/位置是什么样子的?您好,谢谢您的回答。我有一个问题:我以前的“environments/development.rb”中有一行:“Paperclip.options[:command\u path]=”/usr/local/bin/”“我应该在这行后面添加建议行:“Paperclip\u STORAGE\u options={……}还是替换它。谢谢这不起作用。我收到了这个错误”路由错误未初始化常量资源::回形针存储选项“添加之前或之后:无所谓。我只是重新检查了一下:对我来说也一样。您是否尝试重新启动服务器?确保您在配置中写入了相同的常量名称,或者启动了哪个环境,或者将配置放在了哪里。。。标准调试过程。但我不知道你为什么会遇到路由错误。奇怪的是,也许这是个错误。
    #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"