私は、ペーパークリップを使用してAmazonS3にデータを保存するRailsアプリを開発しています。アプリはHerokuでホストされています。私はUbuntuKarmicで開発しています。
これから説明する問題は、開発(ローカルホスト上)と本番環境(Heroku上)で発生します。
S3クレジットをペーパークリップに渡す標準的な方法は、次のようにconfig/s3.ymlに配置することです。
access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432
これを行うと、すべてが正常に機能します。ただし、これによりコードを他のユーザーと共有することが難しくなるため、Herokuは別の方法(http://docs.heroku.com/config-vars )を提案します。
彼らはあなたがあなたのS3_KEYとS3_SECRETをあなたの.bashrcに次のように入れるべきであるとアドバイスします:
S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET
次に、config / initializers / s3.yml(わずかに異なるパスに注意)を作成し、そのファイルに次のように配置することを提案します。
AWS::S3::Base.establish_connection!(
:access_key_id => ENV['S3_KEY'],
:secret_access_key => ENV['S3_SECRET']
)
しかし、これを行うと、ペーパークリップがぐらつきをスローし、次のエラーメッセージを吐き出します。
undefined method `stringify_keys' for #<String:0xb6d6c3f4>
/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'
.... other stuff
つまり、明らかに、すべてがstorage.rbモジュール内で開始されています。スタックトレースをステップスルーします。
行176のparse_credentialsメソッドにフラグが付けられています-コードに表示される呼び出しは次のとおりです。
def parse_credentials creds
creds = find_credentials(creds).stringify_keys
(creds[RAILS_ENV] || creds).symbolize_keys
end
parse_credentialsメソッドは別のメソッドfind_credentialsを呼び出そうとしますが、これが問題であると私は信じています。find_credentialsのコードは次のとおりです。
def find_credentials creds
case creds
when File
YAML::load(ERB.new(File.read(creds.path)).result)
when String
YAML::load(ERB.new(File.read(creds)).result)
when Hash
creds
else
raise ArgumentError, "Credentials are not a path, file, or hash."
end
end
find_credentialsメソッドが.bashrcファイルから値を読み取るためにどのように装備されているかがわかりません。YAMLから読み取ることができるケースとハッシュを検索するケースが2つあります。
私のモデルは次のようにクレデンシャルを参照します:
has_attached_file :photo,
(some code removed)
:s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",
モデルから:s3_credentialsハッシュを削除すると、stringify_keysエラーがなくなり、railsコンソールはfind_credentialsメソッドの最後に表示されるエラーメッセージをスローします。つまり、「クレデンシャルはパス、ファイル、またはハッシュではありません」。
だから私は困惑しています。これはおそらくHerokuの人たち(彼らが答えてくれることを期待してこのリンクを実際にメールで送信する予定です)の質問であり、thoughtbotのdoodsの質問でもあることを理解しています。
最初に言ったように、キーとシークレットをconfig / s3.ymlに貼り付けるという標準的なアプローチをとると、アプリは正常に動作しますが、Herokuが提案する方法を使用することをお勧めします。これにより、作業がはるかに簡単になります。つまり、自分のリポジトリをパブリックgithubページに保存して、他の人が使用できるようにすることができます。Gitでカスタマーマージドライバーを記述して、APIキーをパブリックドメインから除外する必要はありません。
enV変数をetc/bash.bashrcと〜/ .bashrcに貼り付けてみましたが、再起動しても同じ問題が発生します。問題は、Herokuだけでなく開発マシンでも発生します。config-varsもHerokuにプッシュするようにしました。