サーチ…


Carrierwaveを使用した単一のファイルアップロード

ファイルアップロードをRailsで使用することは簡単です。まず、アップロードを管理するための選択プラグインが必要です。最も一般的なものはCarrierwavePaperclipです。どちらも機能は似ていて、ドキュメントは豊富です

Carrierwaveを使った簡単なアバターアップロード画像の例を見てみましょう

Carrierwaveをbundle install後、コンソールに入力してください

$ rails generate uploader ProfileUploader

これにより/app/uploaders/profile_uploader.rbにある設定ファイルが作成されます

ここでは、ストレージ(つまりローカルまたはクラウド)を設定したり、画像操作用の拡張機能を適用したり(つまり、MiniMagickを使用してサムを生成する)、サーバー側拡張のホワイトリストを設定することができます

次に、user_picの文字列tipeで新しい移行を作成し、 user.rbモデルでuploaderをマウントします。

mount_uploader :user_pic, ProfileUploader

次に、アバターをアップロードするためのフォームを表示します(ユーザーの編集ビューかもしれません)

<% form_for @user, html: { multipart: true } do |f| %>
    <%= f.file_field :user_pic, accept: 'image/png, image/jpg' %>
    <%= f.submit "update profile pic", class: "btn" %>
<% end %>

フォームがアップロードを処理できるように{multipart:true}を含めてください。 Acceptは、クライアント側の拡張ホワイトリストを設定するオプションです。

アバターを表示するには、単に

<%= image_tag @user.user_pic.url %>

ネストされたモデル - 複数のアップロード

複数のアップロードを作成する場合は、まず新しいモデルを作成して関係を設定する

たとえば、Productモデルで複数の画像が必要な場合を考えてみましょう。新しいモデルを作成し、それをあなたの親モデルにbelongs_toせる

rails g model ProductPhoto

#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos

#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)

accepts_nested_attributes_forは、ネストされたフォームを作成できるので、新しいファイルをアップロードし、製品名を変更し、価格を単一のフォームから設定できるため、 必須です

次に、ビュー(編集/作成)でフォームを作成し、

    <%= form_for @product, html: { multipart: true } do |product|%>

        <%= product.text_field :price # just normal type of field %>

        <%= product.fields_for :product_photos do |photo| # nested fields %>
            <%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
        <% end %>
        <%= p.submit "Update", class: "btn" %>
    <% end %>

コントローラーは何も特別なものではありません。新しいコントローラーを作成したくない場合は、製品コントローラー内に新しいコントローラーを作成してください

  # create an action
  def upload_file
    printer = Product.find_by_id(params[:id])
    @product_photo = printer.prodcut_photos.create(photo_params)
  end

  # strong params
  private
    def photo_params
      params.require(:product_photos).permit(:image)
    end

すべての画像をビューに表示する

    <% @product.product_photos.each do |i| %>
        <%= image_tag i.image.url, class: 'img-rounded' %>
    <% end %>


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow