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

希望对你有帮助