20

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

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

これを理解したので、エッジレールのドキュメントがこれを明確に述べている理由を理解できません。

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

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

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

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

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

4

1 に答える 1

31

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

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

おまけとして、Rails の画像アップロード gem である Carrierwave は、構成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

お役に立てれば!

于 2014-02-05T18:45:46.877 に答える