2

最初に、私は Ruby と Rails に関してはまったくの初心者であるということから始めさせてください。

heroku へのデプロイに成功したアプリのソースを入手しました。開発モードで実行すると正常に動作しますが、本番モードに切り替えると画像が表示されません。

アプリはassets_sync Gem を使用しており、画像やその他のアセットは、S3 バケットを使用して AWS から提供する必要があります。css ファイルと js ファイルは正しく処理されますが、画像は処理されません。この記事では、それがどのように機能するかについて非常によく説明してい ます https://firmhouse.com/blog/complete-guide-to-serving-your-rails-assets-over-s3-with-asset_sync

私が知る限り、css と画像はプリコンパイルされています。sass から生成された css を使用して、画像を 1 つのスプライトに結合します。この記事は、ここで何が起こっているかを説明するのに役立ちましたhttp://compass-style.org/help/tutorials/spriting/ (経験豊富なレール開発者にとってはおそらく新しいものではありません)

もう少し掘り下げて、実行中のアプリの css を表示すると、背景画像の URL プロパティに URL からのバケット名がありません。

以下に例を示します。私はその部分が次のようになると確信してい//.s3ます//mybucket.s3:

someclass {
    background: url(http://.s3.amazonaws.com/assets/myicon.png)
}

URLを取得してブラウザのアドレスバーに直接配置すると、画像が表示されません!. しかし、バケット名を追加するとすぐに、イメージがダウンロードされます。つまり、次のように動作し、イメージが s3 バケットに存在することを確認します。

http://my-bucket.s3.amazonaws.com/assets/myicon.png

これは、css が正しくプリコンパイルされておらず、おそらく構成からバケット名が見つからないことを意味します。

heroku の設定が正しいことを確認しました。以下のセットで:

  • FOG_PROVIDER、
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • FOG_DIRECTORY
  • FOG_REGION

私はこれでかなりの時間を費やして壁にぶつかり、結果なしで問題をグーグルしました。それで、誰かが以前にこの問題を見たことがありますか、または何がうまくいかないのかを解決する方法を提案していますか?

4

1 に答える 1

2

さて、Rails コミュニティへようこそ!


プリコンパイル

自分自身で asset_sync gem を使用することから、私ができる最善のアドバイスは、Heroku にプッシュする前にローカルでプリコンパイルすることです。さらに、それを機能させるには、いくつかのことを行う必要があります。

  1. asset_path_helpersCSS でを使用する必要があります。
  2. asset_pathS3 の実装を反映するために、本番環境の を変更する必要があります

必要な作業は次のとおりです。

--

前処理

#app/assets/stylesheets/application.css.scss #-> notice the SCSS
someclass {
    background: asset_url("myicon.png")
}

動的アセット パス ヘルパーを使用できるようにするには、Railsの css プリプロセッサ (基本的には SCSS) のいずれかを使用する必要があります。アセットを正しく参照するため、これが最初のステップです。

--

資産ホスト

次に、ファイルの asset_host を変更する必要があります。/config/environments/production.rb

#config/environments/production.rb
config.action_controller.asset_host = "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"

これにより、Rails はアセット パスの作成時に正しい URL をアセット パスの先頭に追加できるようになり、アセット パスからそれらを提供できるようになります。S3

--

最後に、 を使用するときは常にローカルでプリコンパイルする必要がありますasset_sync。理由は忘れましたが、基本的にはすべてのファイルを正しい順序で取得するためです。

$ rake assets:precompile RAILS_ENV=production

これによりasset_sync、正しく実行するために必要なファイルをアップロードできます。または、少なくともそうすべきです:)

于 2014-08-13T08:02:01.953 に答える