5

本番用と開発用の S3 バケットがあります。私は調査を行い、この投稿に出くわしましたが、現在の構成は期待どおりに機能しません。ローカルで次の例外 (以下) が発生し、heroku アプリから S3 バケットにファイルがアップロードされません。

 is not a recognized storage provider
 Extracted source (around line #3):

 1: 
 2: <p><%= user.name %></p>
 3: <%= image_tag user.avatar.url %>
 4: <%= link_to 'Show', user %>
 5: <%= link_to 'Edit', edit_user_path(user) %>
 6: <%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %>

ただしstorage :file、ファイル内に設定すると、*_uploader.rbすべてがローカルで期待どおりに機能します。しかし、まだ S3 バケットに送信されることに注意してください。

これが私のセットアップです:

user.rb

class User < ActiveRecord::Base
 attr_accessible :name, :avatar, :avatar_cache, :remote_avatar_url, :remove_avatar
 mount_uploader :avatar, AvatarUploader
end

霧.rb

CarrierWave.configure do |config|
  if Rails.env.production?
    config.storage = :fog
    config.fog_credentials = {
    :provider              => 'AWS',
    :aws_access_key_id     => ENV['S3_K'],
    :aws_secret_access_key => ENV['S3_SCRT'],
    :region                => ENV['S3_RG']
  }
  config.fog_directory  = ENV['S3_BUCKET']
  config.fog_host       = 'http://www.example.com' 
  config.fog_public     = true                                    # optional, defaults to true
  config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}  # optional, defaults to {}

else
 #for development and testing locally
  config.storage = :file
  config.enable_processing = false
 end
end

*_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base

 storage :fog

 def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
 end

 def extension_white_list
  %w(jpg jpeg gif png)
 end

 end

users_controller.rb

def new
 @user = User.new
 @user.avatar = params[:file]
  respond_to do |format|
   format.html # new.html.erb
   format.json { render json: @user }
  end
end

def create
 @user = User.new(params[:user])
 @user.avatar = params[:file]
  respond_to do |format|
   if @user.save
    format.html { redirect_to @user, notice: 'User was successfully created.' }
    format.json { render json: @user, status: :created, location: @user }
   else
    format.html { render action: "new" }
    format.json { render json: @user.errors, status: :unprocessable_entity }
   end
end

終わり

更新 @CanBerkGüder のおかげで、レコードは保存できるが画像ファイルは保存できないことを確認できます。ユーザー オブジェクトを作成しようとすると、heroku のログが吐き出されます。

2012-02-20T23:19:45+00:00 app[web.1]:   app/controllers/users_controller.rb:46:in `block in create'
2012-02-20T23:19:45+00:00 app[web.1]:   app/controllers/users_controller.rb:45:in `create'
2012-02-20T23:19:45+00:00 app[web.1]: 
2012-02-20T23:19:45+00:00 app[web.1]: cache: [POST /users] invalidate, pass
4

2 に答える 2

1

わかりました、ここにアイデアがあります。CarrierWave には、後方互換性のためにフォグを使用する S3 アダプターがまだ含まれています:fog。理論上は両者に違いはないはずですが、試してみる価値はあると思います。Heroku で実行されているライブ アプリケーションの CarrierWave イニシャライザを次に示します。

CarrierWave.configure do |config|
  if Rails.env.production?
    config.root = Rails.root.join('tmp')
    config.cache_dir = 'carrierwave'

    config.storage = :s3
    config.s3_access_key_id = ENV['S3_KEY']
    config.s3_secret_access_key = ENV['S3_SECRET']
    config.s3_bucket = ENV['S3_BUCKET']
  else
    config.storage = :file
  end
end

最初の 2 行 (config.root と config.cache_dir) は、Heroku の読み取り専用ファイルシステムを回避するためにありますが、これは問題とは関係ありません。

于 2012-02-20T22:35:04.300 に答える
0

1つの問題は

config.fog_host       = 'http://www.example.com'

この設定を使用する場合、実際のホストが必要になる可能性があります。おそらく、その行をコメントアウトすることができますが、強くお勧めします。

そして、Heroku で ENV 変数を設定していると思いますか?

heroku config:add S3_K=[my_s3_key] S3_SCRT=[my_s3_secret] S3_RG=[us-east-1]S3_BUCKET=[my_bucket_name]

私はほとんど同じセットアップを使用しました。私はうまくいきませんでしたが、さらに一歩か二歩進んだと思います:

Missing required arguments: aws_access_key_id, aws_secret_access_key
于 2012-02-24T15:42:37.770 に答える