Carrierwave 嵌套模型设置:不上传文件且不出错
Carrierwave nested model setup: Not uploading the file and not erroring
我正在设置 Carrierwave 来为我的嵌套模型上传图像。现在 Rails 没有错误,Carrierwave 没有上传图像文件。我希望得到一些调试帮助。这是我的设置,想法是拥有一个带有 1 个或多个 DeskImages 的模型 Desk:
desk.rb
class Desk < ActiveRecord::Base
has_many :desk_images, :inverse_of => :desk, :dependent => :destroy
accepts_nested_attributes_for :desk_images, allow_destroy: true
end
desk_image.rb
class DeskImage < ActiveRecord::Base
belongs_to :desk
mount_uploader :image, DeskImageUploader
end
desk_image_upload.rb
class DeskImageUploader < CarrierWave::Uploader::Base
....
end
desks_controller.rb
class DesksController < ApplicationController
def create
@desk = Desk.new(desk_params)
respond_to do |format|
if @desk.save
if params[:images]
params[:images].each { |image|
@desk.desk_images.create(image: image)
}
end
format.html { redirect_to @desk, notice: 'Desk was successfully created.' }
else
format.html { render :new }
end
end
end
/views/desks/_form.html.erb
<%= simple_form_for(@desk) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= file_field_tag "images[]", type: :file, multiple: true %>
<%= f.input :name %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
我做错了什么吗?
将嵌套形式与载波一起使用总是很棘手。让我们尝试解决您的问题。
一切都取决于架构中的图像列类型。如果您也可以上传模式文件和您的 Gemfile,那就太好了。我会给你没有 simple_form gem.
的可能解决方案
我假设你安装了 gem 'carrierwave'
并且你的图像列在 table desk_images
中并且它的类型是字符串。如果迁移正确,您的模式中还应该有 desk_id
整数类型。
在您的 desk_image_upload.rb
中指定上传图片的文件类型和路径。我可以看到你的文件是空的,所以这意味着你没有 运行 rake generate uploader DeskImage
这将自动填充 you! 的上传文件(小错字,应该是 desk_image_uploader.rb
):
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
检查 desks_controller.rb
中的强参数并创建关联。
def show
@desk_images = @desk.desk_images.all
end
def new
@desk = Desk.new
@desk_images = @desk.desk_images.build
end
def create
@desk = Desk.new(desk_params)
respond_to do |format|
if @desk.save
params[:desk_images]['image'].each do |img|
@desk_images = @desk.desk_images.create!(:image => img)
end
format.html { redirect_to @desk, notice: 'Desk was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
def desk_params
params.require(:desk).permit(:title, desk_images_attributes: [:id, :desk_id, :image])
end
在您的 /views/desks/_form.html.erb 中添加多部分表单数据 :html => { :multipart => true })
<%= form_for(@desk, :html => { :multipart => true }) do |f| %>
<%= f.fields_for :desk_images do |d| %>
<div class="field">
<%= d.label :image %><br>
<%= d.file_field :image, :multiple => true, name: "desk_images[image][]" %>
</div>
<% end %>
注意:
如果你安装了,gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
事情会改变。您需要 JSON 或数据库中的数组列类型,而在上传器中您将使用 mount_uploaders :images
。 (复数)请检查 here
当您使用 image/images 提交表单时,请检查您的控制台是否有参数。您还可以检查日志文件夹中的日志文件 development.log
希望对你有帮助
我正在设置 Carrierwave 来为我的嵌套模型上传图像。现在 Rails 没有错误,Carrierwave 没有上传图像文件。我希望得到一些调试帮助。这是我的设置,想法是拥有一个带有 1 个或多个 DeskImages 的模型 Desk:
desk.rb
class Desk < ActiveRecord::Base
has_many :desk_images, :inverse_of => :desk, :dependent => :destroy
accepts_nested_attributes_for :desk_images, allow_destroy: true
end
desk_image.rb
class DeskImage < ActiveRecord::Base
belongs_to :desk
mount_uploader :image, DeskImageUploader
end
desk_image_upload.rb
class DeskImageUploader < CarrierWave::Uploader::Base
....
end
desks_controller.rb
class DesksController < ApplicationController
def create
@desk = Desk.new(desk_params)
respond_to do |format|
if @desk.save
if params[:images]
params[:images].each { |image|
@desk.desk_images.create(image: image)
}
end
format.html { redirect_to @desk, notice: 'Desk was successfully created.' }
else
format.html { render :new }
end
end
end
/views/desks/_form.html.erb
<%= simple_form_for(@desk) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= file_field_tag "images[]", type: :file, multiple: true %>
<%= f.input :name %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
我做错了什么吗?
将嵌套形式与载波一起使用总是很棘手。让我们尝试解决您的问题。
一切都取决于架构中的图像列类型。如果您也可以上传模式文件和您的 Gemfile,那就太好了。我会给你没有 simple_form gem.
的可能解决方案我假设你安装了 gem 'carrierwave'
并且你的图像列在 table desk_images
中并且它的类型是字符串。如果迁移正确,您的模式中还应该有 desk_id
整数类型。
在您的 desk_image_upload.rb
中指定上传图片的文件类型和路径。我可以看到你的文件是空的,所以这意味着你没有 运行 rake generate uploader DeskImage
这将自动填充 you! 的上传文件(小错字,应该是 desk_image_uploader.rb
):
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
检查 desks_controller.rb
中的强参数并创建关联。
def show
@desk_images = @desk.desk_images.all
end
def new
@desk = Desk.new
@desk_images = @desk.desk_images.build
end
def create
@desk = Desk.new(desk_params)
respond_to do |format|
if @desk.save
params[:desk_images]['image'].each do |img|
@desk_images = @desk.desk_images.create!(:image => img)
end
format.html { redirect_to @desk, notice: 'Desk was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
def desk_params
params.require(:desk).permit(:title, desk_images_attributes: [:id, :desk_id, :image])
end
在您的 /views/desks/_form.html.erb 中添加多部分表单数据 :html => { :multipart => true })
<%= form_for(@desk, :html => { :multipart => true }) do |f| %>
<%= f.fields_for :desk_images do |d| %>
<div class="field">
<%= d.label :image %><br>
<%= d.file_field :image, :multiple => true, name: "desk_images[image][]" %>
</div>
<% end %>
注意:
如果你安装了,gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'
事情会改变。您需要 JSON 或数据库中的数组列类型,而在上传器中您将使用 mount_uploaders :images
。 (复数)请检查 here
当您使用 image/images 提交表单时,请检查您的控制台是否有参数。您还可以检查日志文件夹中的日志文件 development.log
希望对你有帮助