CarrierWave + fogでConoHaのオブジェクトストレージへファイルをアップロードする処理を作ってて知らぬ間にエラーしてた。
さっさとテスト書けよって感じですが書き方分からなくて後回しにしてます。
とりあえず解決方法だけメモ。30分ぐらい悩んだ…
エラー内容

Excon::Errors::PreconditionFailed in IconsController#update
Expected(201) <=> Actual(412 Precondition Failed)
excon.error.response :body => "Bad URL" :headers => {
"Content-Length" => "7"
"Content-Type" => "text/html; charset=UTF-8"
"Date" => "Mon, 29 Feb 2016 23:05:42 GMT"
"X-Trans-Id" => "tx3c40b02b9bed4206be615-0056d4cec6"
} :local_address => "xxx.xxx.xxx.xxx"
:local_port => 63026
:reason_phrase => "Precondition Failed"
:remote_ip => "xxx.xxx.xxx.xxx"
:status => 412
:status_line => "HTTP/1.1 412 Precondition Failed\r\n"
原因
carrierwaveの設定でfog_directoryに/が入っていたのが原因でした。
config/initializers/carrierwave.rb
CarrierWave.configure do |config| container_name = '/unityroom_' + Rails.env # これがNG config.fog_credentials = { provider: 'openstack', openstack_tenant: ENV['CONOHA_TENANT_NAME'], openstack_username: ENV['CONOHA_API_USERNAME'], openstack_api_key: ENV['CONOHA_API_PASSWORD'], openstack_auth_url: ENV['CONOHA_API_AUTH_URL'] + '/tokens', } config.fog_directory = container_name config.storage :fog config.asset_host = ENV['CONOHA_ASSET_HOST'] + container_name end
下記のように書き換えることでエラーは解消した。
container_name = 'unityroom_' + Rails.env
めでたしめでたし。