簡體   English   中英

Paperclip / S3的“缺少必需:桶選項”

[英]“missing required :bucket option” for Paperclip/S3

在我的Rails應用程序中,我讓用戶在創建“發布”時上傳圖像,並且應該直接上傳到S3。 我在開發和生產中都遇到以下錯誤。

編輯:我應該注意,嘗試從表單提交上的發布編輯頁面上傳時會發生此錯誤。

ArgumentError in ReleasesController#update

missing required :bucket option
Rails.root: /Users/jasondemeuse/pressed

我以前做過這個沒有使用過Carrierwave的問題,但是現在因為我正在使用Paperclip而無法弄清楚我做錯了什么。 我在SO和其他地方看到的所有修復都是heroku問題,但是我在開發時遇到了同樣的問題而且沒有一個修復有幫助。

這是相關代碼(“...”表示不相關的代碼段):

development.rb

Appname::Application.configure do

...

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

production.rb

Appname::Application.configure do

...

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

release.rb

class Release < ActiveRecord::Base
  attr_accessible ... :banner


  belongs_to :user


  has_attached_file :banner, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>',
    spread: '1200x200'
  }

  has_many :banners, :dependent => :destroy
  accepts_nested_attributes_for :banners, :allow_destroy => true


end

show.html.erb

<%= image_tag @release.banner.url(:medium) %>
<%= @release.banner.url %>

// Have both of these in for now to see if they work, but since the upload isn't working it's giving me the missing.png

_form.html.erb

<%= f.label "Add A Banner?" %><br />
<%= f.file_field :banner %>

heroku config(在.bash_profile中用於開發)

AWS_ACCESS_KEY_ID:            XXXXXXXXXXXXXXXX
AWS_BUCKET:                   appname
AWS_SECRET_ACCESS_KEY:        XXXXXXXXXXXXXXXXXXXXXXXXXXX

編輯:這是我的控制器的相關部分

  def update
    @release = Release.find(params[:id])


    respond_to do |format|
      if @release.update_attributes(params[:release])
        format.html { redirect_to [@user,@release], notice: 'Release was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @release.errors, status: :unprocessable_entity }
      end
    end
  end

我知道這應該是非常簡單的,我確信我只是忘記了一些明顯的東西,但我一直在討論這個演練以及我發現的修復,似乎沒有任何工作。 是否有我忘了運行的rake任務或捆綁或什么?

先感謝您!

編輯2:以下答案幫助了我很多,並切換到fog寶石固定大多數東西給我。 為了防止其他人遇到這些相同的問題,我也遇到了另一個讓我感到困惑的問題。 如果你有heroku問題和Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):確保你運行heroku rake db:migrate然后用heroku restart啟動heroku。 我加載了我的架構,錯誤地認為我不需要這樣做。

可以在此處找到上述答案。

我認為這是因為:bucket應該是一個傳遞給Paperclip而不是S3的選項。
固定配置

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

Paperclip :: Storage :: S3 doc似乎證實了,即使編寫得很糟糕/格式化。

編輯:

在我的一個項目中,我使用Paperclip with Fog gem,這很有效

Paperclip::Attachment.default_options.merge!(
  :storage => :fog,
  :fog_credentials => {
    :provider => 'AWS',
    :aws_access_key_id => ENV['S3_ACCESS_KEY_ID'],
    :aws_secret_access_key => ENV['S3_SECRET_ACCESS_KEY'],
    :region => 'eu-west-1' # in case you need it
  },
  :fog_directory => ENV['S3_BUCKET'], # only one of those is needed but I don't remember which
  :bucket => ENV['S3_BUCKET']
)

在我的例子中,我使用的是使用.env文件存儲環境變量的工頭(Heroku)。 所以,當我做rake db:migrate它無法找到ENV['AWS_ACCESS_KEY_ID']

我做了什么來運行我的遷移是我暫時將我的AWS憑證直接添加到Carrierwave配置塊中,然后在...后刪除它們

這不是一個永久的解決方案,因為下次遷移它會說同樣的事情......

有關永久解決方案,請參閱: 在Rake任務中使用環境變量

其中說使用: foreman run rake some_task這樣在.env中定義的所有變量也被加載到rake任務中

將其添加到模塊和類內的application.rb文件中。 創建一個local_env.yml文件並將您的環境變量放在那里。 此代碼將在服務器啟動時加載您的環境變量:

config.autoload_paths += %W(#{config.root}/lib)
config.before_configuration do
    env_file = File.join(Rails.root, 'config', 'local_env.yml')
    YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value
    end if File.exists?(env_file)
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM