【问题标题】:ArgumentError (missing required :bucket option):ArgumentError(缺少必需的 :bucket 选项):
【发布时间】:2014-03-12 19:34:22
【问题描述】:

我正在学习 1 个月的 Rails 课程,但我一直无法通过 Heroku 将图像上传到 AWS 服务器。我的 Github 文件夹:https://github.com/phanatuan/pinteresting

Heroku 日志中的错误是:

"ArgumentError (missing required :bucket option):
app/controllers/pins_controller.rb:31:in `block in create'
app/controllers/pins_controller.rb:30:in `create' " 

我知道这是很多人都会遇到的错误。但是,当我搜索其他 Stackoverflow 问题和答案时,我找不到解决方案。

非常感谢您的帮助

【问题讨论】:

标签: ruby-on-rails ruby heroku amazon-s3


【解决方案1】:

我也遇到了同样的问题,通过运行解决了:

$ heroku config:set S3_BUCKET_NAME=BUCKET_NAME_VALUE

确保您在 production.rb 文件中将名称设置为“S3”:

# Sets Paperclip to upload images to Amazon S3
  config.paperclip_defaults = {
    :storage => :s3,
    :s3_credentials => {
      :bucket => ENV['S3_BUCKET_NAME'],
      :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
      :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
  }

我也为此头疼。

执行上述操作,然后添加并提交并推送到 git,然后运行

git push heroku master

那么希望你一切顺利。我认为你不需要这样做

heroku run rake db:migrate

在这种情况下,但我可能错了。我也是新手!

【讨论】:

    【解决方案2】:

    我目前正在学习 OneMonth Rails 教程,这对我来说也很头疼!

    而不是遵循 OMRails 告诉您的内容,即:

    $ heroku config:set AWS_BUCKET=BUCKET_NAME_VALUE
    

    改用这个:

    $ heroku config:set S3_BUCKET_NAME=BUCKET_NAME_VALUE
    

    然后用:

    $ heroku run rake db:migrate
    $ git push heroku master
    

    如果您已经设置了“AWS_ACCESS_KEY_ID”和“AWS_SECRET_ACCESS_KEY”,则无需重复或更改。

    最终的代码应该是这样的:

    config.paperclip_defaults = {
        :storage => :s3,
        :s3_credentials => {
          :bucket => ENV['S3_BUCKET_NAME'],
          :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
          :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
        }
      }
    

    【讨论】:

      【解决方案3】:

      尝试在您的关联 has_attached_file 中明确定义存储桶

      class Pin < ActiveRecord::Base
          belongs_to :user
      
          has_attached_file :image, 
                  :style => { :medium => "300x300>", :thumb => "100x100>" },
                  :storage => :s3,
                  :bucket  => ENV['MY_BUCKET_NAME']
          validates :image, presence: true
          validates :description, presence: true
      end
      

      更明确地说,内联定义所有配置

      class Pin < ActiveRecord::Base
          belongs_to :user
      
          has_attached_file :image, 
                  :style => { :medium => "300x300>", :thumb => "100x100>" },
                  :storage => :s3,
                  :bucket  => ENV['MY_BUCKET_NAME'],
                  :s3_credentials => {
                          :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                          :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
                      },
                      :s3_permissions => 'private',
                      :url => ":s3_domain_url"
          validates :image, presence: true
          validates :description, presence: true
      end
      

      我在这个例子中使用了 ENV 变量,但你显然可以硬编码你的配置值。从那里开始,然后返回将配置放入初始化程序。

      【讨论】:

      • 只是不要将带有密钥和密码的配置文件添加到您的版本控制中。我在开发过程中使用 dotenv gem 轻松添加环境变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2014-05-31
      • 2013-07-25
      • 2017-03-23
      • 1970-01-01
      相关资源
      最近更新 更多