私はRailsがとても簡単です。申し訳ありません。写真をアップロードして、Ruby on Railsに表示する最良の方法を考えています。ブログを作成し、投稿の作成時に写真を添付するオプションを希望します。
ペーパークリップは非常に素晴らしいです。それについて素晴らしいRailsCastがあります- http://railscasts.com/episodes/134-Paperclip
CarrierWaveはPaperclipよりも新しい宝石であり、はるかに柔軟に見えます。それについてのRailscastもあります: http://railscasts.com/episodes/253-carrierwave-file-uploads
あなたが派手な機能を必要とせず、依存関係を追加したくないし、DBに画像をBLOBとして保存したくないと仮定すると、次のようなことができます:
モデル:
class Image < ActiveRecord::Base
def img=(input_data)
self.filename = input_data.original_filename
self.filetype = input_data.content_type.chomp
self.img = input_data.read
end
end
コントローラ:
class ImagesController < ApplicationController
def display_img
@img = Image.find(params[:id])
send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
:disposition => 'inline')
end
end
リンクはこちら より完全なチュートリアルへ。
多くの人がCarrierwave
を使用することをお勧めします。私も例外ではありませんが、1つ指摘したいことがあります。 RoRで書かれた多くのサイト(明らかにRoRの問題だけではありません)で、写真を送信しているリクエストが2〜3秒間保留されることがあり、さらに多くの場合、アプリケーションインスタンスを結び付けます(おそらくそれほどひどくないでしょう)スレッドを使用している場合、またはパフォーマンスにあまり関心がない場合でも、Unicornを使用している場合は間違いありません)。そのため、搬送波を使用してそれを回避する方法を説明します。
1)アプリのバックグラウンドワーカーを選択します(通常Sidekiqを使用します)
2)carrierwave_backgrounder
をGemfileに追加し、バックグラウンドワーカーとCarrierwaveで動作するように設定します(readmeのすべて)
通常、ディレクトリを制御できるので、store_in_background
のcarrierwave_backgrounder
オプションを使用して、ファイルシステムまたはS3または使用しているもので画像を処理および保存します。
3)ここで、画像を更新すると、その処理と保存がバックグラウンドになり、アプリケーションインスタンスが解放されますが、多くの場合1秒以上かかるため、ユーザーに応答を返す必要があります
4)ユーザーに何らかの応答を提供する最も簡単な方法は、古い画像をスピナーまたはそのようなものでgifに変更し、画像が処理されたかどうかを確認するjavascript SetInterval
関数を設定するjavascriptを返すことです(carrierwave_background
は、処理が完了するとモデルのブール列をtrueに変更できる関数を提供します)AJAX
リクエストを2秒ごとまたは任意に送信し、処理されたときに画像を変更します。
これで、関連付けられていないアプリケーションインスタンスと優れたユーザーエクスペリエンスが同時に得られました。
PS私はRailsおよびWeb開発自体は初めてなので、このガイドでは私が見逃したいくつかの注意事項があるかもしれません
それが誰かを助けることを願っています。
ああ、ところで、refile
と呼ばれるこの新しいgemがあります。それは驚くべきことであり、場合によっては本当に良いオプションになります。
CarrierWaveは、おそらくRailsでの画像アップロードに最適なソリューションです。次の投稿では、画像変換がクラウドでシームレスに行われている間にCarrierWaveを使用して画像をアップロードするためのソリューションについて説明します。アップロードされた画像はクラウドに保存され、CDNを介して配信されます。 RMagick、MiniMagick、ImageMagickをインストールする必要はありません。 http://cloudinary.com/blog/Ruby_on_Rails_image_uploads_with_carrierwave_and_cloudinary
多くの人が Paperclip を推奨しています。おそらく、最初にそれを使用してみてください。
最近この質問を確認している方は、 Rails 5.2+にはデフォルトでActiveStorageが搭載されています。チェックアウトすることを強くお勧めします。
コアの一部であるため、Rails 5.2+、現在は非常によく統合されており、すぐに使用できる優れた機能を備えています(Carrierwave、Shrine、Paperclipなど、他のすべての有名な宝石。 ..素晴らしいですが、これは非常に優れた機能を提供しており、新しいRailsプロジェクト)
Paperclipチームは、gemを廃止して、Rails ActiveStorage。
ここにActiveStorageのgithubページがあります &多くのリソースがどこでも利用可能です
一部の高度な機能はActiveStorageでは使用できませんが、ユースケースがシンプルな場合、サードパーティのクラウドストレージ(s3、デジタルオーシャンスペースなど)をインストールして統合する最も簡単なアップロードgemの1つになる可能性があることに注意してください
たとえば、主な欠点の1つは、ActiveStorageでアップロードのパスを定義できないことです。それを行うためのハックがあるため、各環境が異なるパスにアップロードされます(それでも、それは私にとって大きな迷惑です) )
アップロードにさらに柔軟性と高度な機能が必要な場合は、Shrineをチェックすることをお勧めします
attachment_fu(http://github.com/technoweenie/attachment_fu
)は別のオプションですが、個人的には Paperclip をお勧めします。大きな魔法であるRmagickを必要とせず、マイナー構成でのS3へのアップロードなどのクールな機能をサポートします。