web-dev-qa-db-ja.com

Rails public /またはapp / assets /の4つの静的アセット

これが単純な質問の長い積み上げである場合は申し訳ありませんが、私の考えを明確にしたいと思いました。

Rails 4をいくつかのプロジェクトで使用しており、image_tag('/assets/image.png')を使用して、アセットパスヘルパーがRails 4.それが今日まで私は変更についてさらに学ぶことを決め、 sprockets-Railsのこの最初の変更ノート を見つけました。また、ASSET_PUBLIC_DIRECTORIES in /actionview/lib/action_view/helpers/asset_url_helper.rb#L170 in Railsヘルパーはパブリックフォルダーのみを指します。静的ファイルにアクセスしている場合、= Railsは、パブリックフォルダーの使用を求めています。

だから私はこれを理解したので、Edge Rails docsが明確に述べている理由が理解できませんこの:

Railsの以前のバージョンでは、すべてのアセットは、画像、JavaScript、スタイルシートなどのパブリックのサブディレクトリにありました。アセットパイプラインにより、これらのアセットの優先場所はapp/assetsディレクトリになります。

image_pathは実際にはpublic/imagesフォルダーへのURIを生成しますが、まったく逆です。

これをすべてまとめると、利用可能なすべてのヘルパーとダイジェストビルダーを使用する必要があります。最終的には、アセットをS3に asset_sync でデプロイするためです。

だから私の質問はただです。画像/コンパイルされていないアセットを配置し、asset_pathヘルパーを使用するための正しい場所はありますか?すべてのドキュメントと他のすべてのスタックオーバーフローの会話はapp/assetsフォルダーを使用している人々に関するものですが、sprockets-Railsは非ダイジェストアセットにpublicを使用することを望んでいます。 Web上のドキュメントと情報は更新が必要なだけですか、それともすべてのアセットパスの前に/ assets /を付けるだけで適切なものですか。

更新:開発サーバーを再起動せず、app/assets/images内の画像が表示されなかったため、フォールバックして公開されるという問題が実際にあったと思います。また、Paperclipのdefault_urlでアセットヘルパーを使用していたことにも注意してください(これは、見つけたいくつかのスタックオーバーフローの回答でアセットを指す方法として参照されていますが、Paperclipの補間オプションでアセットパスヘルパーを使用すると、パブリックにフォールバックします。補間されていないアセット名は、明らかに既存のファイルとしては見つかりません。

20
Taylor j. Eke

rake assets:precompileを使用すると、Railsはすべてのアセットをapp/assetsフォルダからpublic/assetsに移動します。これは、通常のブラウザがアクセスできないためですappディレクトリにアクセスできますが、publicにはアクセスできます。

だから、あなたの質問に答えるために、ここに私の考えがあります。画像がロゴや背景などのサイトレイアウト用である場合は、app/assets/imagesディレクトリに保存する必要があります。ただし、画像がプロフィール画像などのユーザー生成の場合は、これらを直接何かに保存する必要があります。 public/imagesとして。理想的には、これらをS3またはCDNに格納しますが、すでに実行しています。

おまけとして、Carrierwaveは、Rails画像アップロードgemであり、public/imagesタイプのパスを画像のデフォルトストアとして使用します。設定ファイルで確認できます。

    # Override the directory where uploaded files will be stored.
    # This is a sensible default for uploaders that are meant to be mounted:
     def store_dir
     "images/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
     end

お役に立てれば!

31
Amar H-V