0

assets/books_iconユーザーが本を作成するときに、本のIDと同じ名前の画像をアップロードするレールアプリケーションがあります。

upload_icon(params[:book][:image_upload])

# upload_image when create/update book
    def upload_icon(uploaded_io)
       photo_directory = "app/assets/images/"

       # only when user upload the iphoto
       if uploaded_io.present?

         # upload to the exact location with category_id
         extension = File.extname(uploaded_io.original_filename)
         photo_location = 'books_image/'+ @book.id.to_s + extension

         # open in binary mode
         photo_full_location = photo_directory + photo_location
         File.open(photo_full_location, 'wb') do |file|
           file.write(uploaded_io.read)
         end

         # only have to state which is the directory, 
         # image_tag will use assets piepline which will add 'assets/images/' as prefix in src 
         @book.update_attribute(:image_url, photo_location)
       end
     end

それは開発モードで動作します。次に、mysqlをデータベースとしてmac Apache2サーバーにパッセンジャーを使用してrailsアプリケーションをデプロイconfig.assets.compile = trueし、開発構成ファイルを変更しました。

プロダクション モードでは、新しい本を作成し、画像を にアップロードできますassets/books_icon。ただし、アップロードしたばかりの画像のファイル パスはupdate.

たとえば、ID 2 の新しい本を作成すると、.jpg に 2.jpg がありassets/books_iconます。http://localhost/assets/images/books_icon/2.jpgしかし、Rails アプリケーションは、見つからないことを教えてくれます。

ただし、Apache サーバーを再起動すると、次の場所で画像を表示できます。http://localhost/assets/images/books_icon/2.jpg

この種のcaching問題を解決する解決策はありますか??

4

1 に答える 1

2

このコンテキストでは、アップロードされた画像は実際には「資産」とは見なされません。たまたま別の場所に保存されているデータと考えてください。(画像アセットは、ロゴや背景画像などです)。Rails のアセット パイプラインは、実際のリソース (画像など) がアセットである場合に、単純なファイル パスを解決するためにかなりトリッキーなことを行います。

デフォルトでは、Rails はapp/publicフォルダーをドキュメント ルートにします。したがって、画像をアップロードできる場所になります。おそらく、"upload/img" という名前のサブディレクトリにあり、その場合は path で参照できます/upload/img/mybook.jpg

このアプローチは脆弱になりがちですが、画像は実際にはデータベース内のデータに直接関連付けられていますが、サーバーのファイルシステムに配置されているためです。開発からステージングまたは運用サーバーに移行すると、バラバラになり始めます。

お勧めしない方法の 1 つは、画像をアップロードして、データベースに blob 型として保存することです。もう1つお勧めするのは、データベースの拡張として機能する画像をアップロードできる別の「中央」サーバーを用意することです。このような目的でAmazon AWSの「S3」サービスを利用する人は多いです。CarrierWave gemを見てみましょう。これは、これらすべてを非常に簡単、柔軟、強力にする優れた仕事をしています。

于 2012-11-29T14:10:04.940 に答える