ruby-on-rails - 单个型号的carrierwave多个上传器
问题描述
我在本教程https://kolosek.com/carrierwave-upload-multiple-images/的帮助下创建了一个图库模块,现在我想向同一模型添加一个具有主图像的图像属性。所以我想再创建一个上传器,但我有点困惑如何调用控制器有人可以帮助我吗?
我的代码如下所示:
型号代码:
class Image < ApplicationRecord
belongs_to :gallery
mount_uploader :image, ImageUploader
mount_uploader :avatar, AvatarUploader
end
class Gallery < ApplicationRecord
has_many :images
accepts_nested_attributes_for :images
end
画廊控制器.rb
class GalleriesController < AdminController
def index
@galleries = Gallery.all
end
def show
@images = @gallery.images.all
end
def new
@gallery = Gallery.new
@image = @gallery.images.build
end
def create
@gallery = Gallery.new(gallery_params)
respond_to do |format|
if @gallery.save
params[:images]['image'].each do |a|
@images = @gallery.images.create!(:image => a, :gallery_id => @gallery.id)
end
format.html { redirect_to @gallery, notice: 'Gallery was successfully created.' }
format.json { render :show, status: :created, location: @gallery }
else
format.html { render :new }
format.json { render json: @gallery.errors, status: :unprocessable_entity }
end
end
end
def gallery_params
params.require(:gallery).permit(:title, :details, :status, images_attributes:[:id, :gallery_id, :image, :avatar])
end
图像控制器代码:
class ImagesController < AdminController
def image_params
params.require(:image).permit(:gallery_id, :slideshow_id,:image, :avatar)
end
end
form.html.erb
<%= form.fields_for :images do |p| %>
<div class="field">
<%= form.label :master_image, class: "col-2 col-form-label" %>
<%= form.file_field :avatar, :multiple => true, name: "images[avatar][]" %>
</div>
<% end %>
<%= form.fields_for :images do |p| %>
<div class="field">
<%= form.label :image, class: "col-2 col-form-label" %>
<%= form.file_field :image, :multiple => true, name: "images[image][]" %>
</div>
<% end %>
我对修改画廊控制器创建部分感到困惑。
解决方案
create
如果您有 2 个上传者,您可以在该方法中添加 2 次图像创建
params[:images]['image'].each do |a|
@gallery.images.create!(:image => a, :gallery_id => @gallery.id)
end
params[:images]['avatar'].each do |a|
@gallery.images.create!(:avatar => a, :gallery_id => @gallery.id)
end
但我认为这有点冗长,如果您不想在表单中上传任何图像,它并不能真正阻止(返回params[:images]['...']
nil)
顺便说一句,您的表格不适合form.fields_for
. 它的 :
<%= form.fields_for :images_attributes do |p| %>
<div class="field">
<%= p.label :master_image, class: "col-2 col-form-label" %>
<%= p.file_field :avatar, :multiple => true, name: "images[avatar][]" %>
</div>
<% end %>
<%= form.fields_for :images_attributes do |p| %>
<div class="field">
<%= p.label :image, class: "col-2 col-form-label" %>
<%= p.file_field :image, :multiple => true, name: "images[image][]" %>
</div>
<% end %>
推荐阅读
- android - 我可以丢弃并重新上传上传到 Playstore 的相同版本的未发布 APK 吗?
- javascript - 如何将多个文件中的 ES6 模块捆绑到一个 ES6 模块中?
- c# - 使用sql命令将数据插入数据库的问题
- memory - 如果进程不适合内存怎么办?
- php - PHP选择框验证
- android - 在 Android 中使用 Firebase MLKit 的 LiveObjectDetection
- sql - 如何在插入语句中使用每个月的动态表,而我们在一列中传递一个静态值
- qmap - 错误:没有适用于“bbox”的方法应用于“范围”类的对象
- sql - 如何从具有多个外键的多个表中删除行?
- ruby - 如何在 rspec 中测试私有助手(模块)方法