Ini adalah solusi untuk mengunggah banyak gambar menggunakan gelombang pembawa di rel 4 dari awal
Atau Anda dapat menemukan demo yang berfungsi:
Multiple Attachment Rails 4
Untuk melakukan cukup ikuti langkah-langkah ini.
rails new multiple_image_upload_carrierwave
Dalam file permata
gem 'carrierwave'
bundle install
rails generate uploader Avatar
Buat perancah posting
rails generate scaffold post title:string
Buat perancah post_attachment
rails generate scaffold post_attachment post_id:integer avatar:string
rake db:migrate
Di post.rb
class Post < ActiveRecord::Base
has_many :post_attachments
accepts_nested_attributes_for :post_attachments
end
Di post_attachment.rb
class PostAttachment < ActiveRecord::Base
mount_uploader :avatar, AvatarUploader
belongs_to :post
end
Di post_controller.rb
def show
@post_attachments = @post.post_attachments.all
end
def new
@post = Post.new
@post_attachment = @post.post_attachments.build
end
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
params[:post_attachments]['avatar'].each do |a|
@post_attachment = @post.post_attachments.create!(:avatar => a)
end
format.html { redirect_to @post, notice: 'Post was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
private
def post_params
params.require(:post).permit(:title, post_attachments_attributes: [:id, :post_id, :avatar])
end
Dalam views / posts / _form.html.erb
<%= form_for(@post, :html => { :multipart => true }) do |f| %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<%= f.fields_for :post_attachments do |p| %>
<div class="field">
<%= p.label :avatar %><br>
<%= p.file_field :avatar, :multiple => true, name: "post_attachments[avatar][]" %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Untuk mengedit lampiran dan daftar lampiran untuk setiap posting.
Dalam views / posts / show.html.erb
<p id="notice"><%= notice %></p>
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<% @post_attachments.each do |p| %>
<%= image_tag p.avatar_url %>
<%= link_to "Edit Attachment", edit_post_attachment_path(p) %>
<% end %>
<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>
Perbarui formulir untuk mengedit tampilan lampiran / post_attachments / _form.html.erb
<%= image_tag @post_attachment.avatar %>
<%= form_for(@post_attachment) do |f| %>
<div class="field">
<%= f.label :avatar %><br>
<%= f.file_field :avatar %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Ubah metode pembaruan di post_attachment_controller.rb
def update
respond_to do |format|
if @post_attachment.update(post_attachment_params)
format.html { redirect_to @post_attachment.post, notice: 'Post attachment was successfully updated.' }
end
end
end
Dalam rails 3 tidak perlu untuk menentukan parameter yang kuat dan karena Anda dapat mendefinisikan atribut_accessible di kedua model dan accept_nested_attribute to post model karena atribut yang dapat diakses sudah tidak digunakan lagi di rails 4.
Untuk mengedit lampiran, kami tidak dapat mengubah semua lampiran dalam satu waktu. jadi kami akan mengganti lampiran satu per satu, atau Anda dapat memodifikasi sesuai aturan Anda, Di sini saya hanya menunjukkan kepada Anda cara memperbarui lampiran apa pun.