web-dev-qa-db-ja.com

写真のアップロードRuby on Rails

私はRailsがとても簡単です。申し訳ありません。写真をアップロードして、Ruby on Railsに表示する最良の方法を考えています。ブログを作成し、投稿の作成時に写真を添付するオプションを希望します。

38
bgadoci

ペーパークリップは非常に素晴らしいです。それについて素晴らしいRailsCastがあります- http://railscasts.com/episodes/134-Paperclip

25
danpickett

CarrierWaveはPaperclipよりも新しい宝石であり、はるかに柔軟に見えます。それについてのRailscastもあります: http://railscasts.com/episodes/253-carrierwave-file-uploads

18
Felipe Cerda

あなたが派手な機能を必要とせず、依存関係を追加したくないし、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

リンクはこちら より完全なチュートリアルへ。

7
JRL

多くの人がCarrierwaveを使用することをお勧めします。私も例外ではありませんが、1つ指摘したいことがあります。 RoRで書かれた多くのサイト(明らかにRoRの問題だけではありません)で、写真を送信しているリクエストが2〜3秒間保留されることがあり、さらに多くの場合、アプリケーションインスタンスを結び付けます(おそらくそれほどひどくないでしょう)スレッドを使用している場合、またはパフォーマンスにあまり関心がない場合でも、Unicornを使用している場合は間違いありません)。そのため、搬送波を使用してそれを回避する方法を説明します。

1)アプリのバックグラウンドワーカーを選択します(通常Sidekiqを使用します)

2)carrierwave_backgrounderをGemfileに追加し、バックグラウンドワーカーとCarrierwaveで動作するように設定します(readmeのすべて)

通常、ディレクトリを制御できるので、store_in_backgroundcarrierwave_backgrounderオプションを使用して、ファイルシステムまたはS3または使用しているもので画像を処理および保存します。

3)ここで、画像を更新すると、その処理と保存がバックグラウンドになり、アプリケーションインスタンスが解放されますが、多くの場合1秒以上かかるため、ユーザーに応答を返す必要があります

4)ユーザーに何らかの応答を提供する最も簡単な方法は、古い画像をスピナーまたはそのようなものでgifに変更し、画像が処理されたかどうかを確認するjavascript SetInterval関数を設定するjavascriptを返すことです(carrierwave_backgroundは、処理が完了するとモデルのブール列をtrueに変更できる関数を提供します)AJAXリクエストを2秒ごとまたは任意に送信し、処理されたときに画像を変更します。

これで、関連付けられていないアプリケーションインスタンスと優れたユーザーエクスペリエンスが同時に得られました。

PS私はRailsおよびWeb開発自体は初めてなので、このガイドでは私が見逃したいくつかの注意事項があるかもしれません

それが誰かを助けることを願っています。

ああ、ところで、refileと呼ばれるこの新しいgemがあります。それは驚くべきことであり、場合によっては本当に良いオプションになります。

5
NoDisplayName

CarrierWaveは、おそらくRailsでの画像アップロードに最適なソリューションです。次の投稿では、画像変換がクラウドでシームレスに行われている間にCarrierWaveを使用して画像をアップロードするためのソリューションについて説明します。アップロードされた画像はクラウドに保存され、CDNを介して配信されます。 RMagick、MiniMagick、ImageMagickをインストールする必要はありません。 http://cloudinary.com/blog/Ruby_on_Rails_image_uploads_with_carrierwave_and_cloudinary

3
Cloudinary

多くの人が Paperclip を推奨しています。おそらく、最初にそれを使用してみてください。

3
Joshua Partogi

2019年8月に更新

最近この質問を確認している方は、 Rails 5.2+にはデフォルトでActiveStorageが搭載されています。チェックアウトすることを強くお勧めします。

コアの一部であるため、Rails 5.2+、現在は非常によく統合されており、すぐに使用できる優れた機能を備えています(Carrierwave、Shrine、Paperclipなど、他のすべての有名な宝石。 ..素晴らしいですが、これは非常に優れた機能を提供しており、新しいRailsプロジェクト)

Paperclipチームは、gemを廃止して、Rails ActiveStorage。

ここにActiveStorageのgithubページがあります &多くのリソースがどこでも利用可能です

重要な注意点

一部の高度な機能はActiveStorageでは使用できませんが、ユースケースがシンプルな場合、サードパーティのクラウドストレージ(s3、デジタルオーシャンスペースなど)をインストールして統合する最も簡単なアップロードgemの1つになる可能性があることに注意してください

たとえば、主な欠点の1つは、ActiveStorageでアップロードのパスを定義できないことです。それを行うためのハックがあるため、各環境が異なるパスにアップロードされます(それでも、それは私にとって大きな迷惑です) )

アップロードにさらに柔軟性と高度な機能が必要な場合は、Shrineをチェックすることをお勧めします

公式ページによると、他の宝石との神社比較

2
Ahmed Elkoussy

attachment_fu(http://github.com/technoweenie/attachment_fu)は別のオプションですが、個人的には Paperclip をお勧めします。大きな魔法であるRmagickを必要とせず、マイナー構成でのS3へのアップロードなどのクールな機能をサポートします。

2
samg