14

ユーザーが 1 つの file_field から複数の画像をアップロードできるようにするソリューションを探しています。Jquery File Upload や Uploadify などのオプションを調べましたが、実用的なソリューションを備えた良い例をまだ見つけていません。

すでに複数の画像をセットアップしていますが、

 has_attached_file :asset,
                   :styles => { :large => "640x480", :medium => "300x300", :thumb => "100x100" },
                   :storage => :s3,
                   :s3_credentials => "#{Rails.root}/config/s3.yml",
                   :path => "/:contributor_id/:listing_name/:filename"

現在、5 つの個別の file_fields を表示しています

def new
  @listing = Listing.new
  5.times {@listing.assets.build }

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @listing }
  end
end

私はを頂きたい

<%= f.file_field :asset, :multiple => true %>

これにより、ユーザーはファイル ブラウザーで複数のファイルを選択できます。しかし、ネストされたモデルでこれらをどのように処理できますか? そして、それらをアップロードしてもらいます。

4

3 に答える 3

7

受け入れられた回答は、HTML に複数のファイルをアップロードするようなものはないと言っています。

<%= f.file_field :files, multiple: true %>

これにより、複数の画像を選択して配列として送信できます。

Dog has_many Imagesとの関係がある場合は、Image has_attachment :file複数の画像を一度にアップロードするには、次のようにします。

あなたのhtml.erbで

<%= form_for @dog, html: { multipart: true } do |f| %>
  <%= f.file_field :files, accept: 'image/png,image/jpeg,image/gif', multiple: true %>
<%= end %>

コントローラーで

def dog_params
  params.require(:dog).permit files: []
end

あなたの犬のモデルで

def files=(array = [])
  array.each do |f|
    images.create file: f
  end
end

これは、すでに 1 つのイメージをアップロードできているが、一度に複数のイメージにアップグレードしたい場合を想定しています。待ち時間が長くなることに注意してください。

待ち時間を短縮するために、スピード アップロードに関連するこの質問に関する私の投稿をのぞき見してください。

于 2017-01-10T05:26:01.183 に答える
2

複数のファイルのアップロードの完全な例を次に示します。ここにuser has_many uploads. 各uploadモデルには、avatar添付ファイルを表す があります。最終的にuploads: user.

モデル

#models/user.rb
class User < ApplicationRecord
  has_many :uploads

  def files=(array_of_files = [])
    array_of_files.each do |f|
      uploads.build(avatar: f, user: self)
    end
  end
end


#models/upload.rb
class Upload < ApplicationRecord
  belongs_to :user

  has_attached_file :avatar
  validates_attachment_content_type :avatar, :content_type => ["image/png"]
end

フォーム:

# views/users/_form.html.erb
<%= form_with(model: user, local: true) do |form| %>

  ...

  <div class="field">
    <%= form.file_field :files, multiple: true %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

コントローラー

class UsersController < ApplicationController
  before_action :set_user, only: [:show]

  def show
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to @user, notice: 'User was successfully created.'
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:name, files: [])
    end
end

ユーザー#show

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>


<h3>Uploads</h3>
<div>
  <% @user.uploads.each do |upload|  %>
    <div>
      <%= link_to upload.avatar.url do%>
        <%= upload.avatar_file_name %>
      <% end %>
    </div>
  <% end %>
</div>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
于 2019-03-08T18:13:38.127 に答える