Rails and carrierwave uploading multiple images fails

痞子三分冷 提交于 2019-12-25 08:34:56

问题


Hello I have a form where I could write some articles, with a title, a content, a main_image, they all come from the same model progress In this same form I have another field from another model progress_attachment I use it to upload multiple images. ( I used carrierwave, and SSR solution as exemple)

It works fortitle date content main image!

But the field with multiple file upload ony allows one image... it should accept multiple... What's wrong?

So here is my form:

 = simple_form_for(@progress, html: { multipart: true} ) do |f|
   =f.input :title
   =f.input :date
   =f.input :content
   =f.input :main_image
   =f.simple_fields_for :progress_attachments do |f|
     =f.input :image, multiple: true, name: "progress_attachments_attributes[:image][]"
   =f.button :submit 

My models:

progress.rb

class Progress < ActiveRecord::Base
  default_scope ->{order(created_at: :DESC)}
  mount_uploader :main_image, MainImageUploader
  has_many :progress_attachments
  accepts_nested_attributes_for :progress_attachments

  validates :main_image,   presence: true
  validates :title,   presence: true
  validates :content,  presence: true
  validates :date,    presence: true
end

progress_attachment.rb

class ProgressAttachment < ActiveRecord::Base
  mount_uploader :image, ImageUploader
  belongs_to :progress
  validates :image, presence: true
end

My controllers: progresses_controller.rb

class ProgressesController < ApplicationController

  def index
    @progresses = Progress.all
  end

  def show
    @progress = Progress.find(params[:id])
    @progress_attachments = @progress.progress_attachments.all
  end

  def new
     @progress = Progress.new
     @progress_attachment = @progress.progress_attachments.build
  end

  def create
     @progress = Progress.new(progress_params)

     respond_to do |format|
       if @progress.save
         params[:progress_attachments]['image'].each do |a|
            @progress_attachment = @progress.progress_attachments.create!(:image => a)
         end
         format.html { redirect_to progresses_path, notice: 'Progress was successfully created.' }
       else
         format.html { render action: 'new' }
       end
     end
   end

   def update
     respond_to do |format|
       if @progress.update(article_params)
         format.html { redirect_to @progress, notice: 'Article was successfully updated.' }
         format.json { render :show, status: :ok, location: @progress }
       else
         format.html { render :edit }
         format.json { render json: @progress.errors, status: :unprocessable_entity }
       end
     end
   end

   def destroy
     @progress.destroy
     respond_to do |format|
       format.html { redirect_to articles_url, notice: 'Article was successfully destroyed.' }
       format.json { head :no_content }
     end
   end
   private
     def progress_params
        params.require(:progress).permit(:title, :content, :date, :main_image, progress_attachments_attributes: [:id, :progress_id, :image])
     end

end

progress_attachements_controller.rb

class ProgressAttachmentsController < ApplicationController
  before_action :set_progress_attachment, only: [:show, :edit, :update, :destroy]

  def index
    @progress_attachments = ProgressAttachment.all
  end

  def new
    @progress_attachment = ProgressAttachment.new
  end

  def create
    @progress_attachment = ProgressAttachment.new(progress_attachment_params)
    @progress_attachment = @progress.progress_attachments.build
    respond_to do |format|
      if @progress_attachment.save
        format.html { redirect_to @progress_attachment, notice: 'Progress attachment was successfully created.' }
        format.json { render :show, status: :created, location: @progress_attachment }
      else
        format.html { render :new }
        format.json { render json: @progress_attachment.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @progress_attachment.update(progress_attachment_params)
        format.html { redirect_to @progress_attachment, notice: 'Progress attachment was successfully updated.' }
        format.json { render :show, status: :ok, location: @progress_attachment }
      else
        format.html { render :edit }
        format.json { render json: @progress_attachment.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @progress_attachment.destroy
    respond_to do |format|
      format.html { redirect_to progress_attachments_url, notice: 'Progress attachment was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private

    def set_progress_attachment
      @progress_attachment = ProgressAttachment.find(params[:id])
    end

    def progress_attachment_params
      params.require(:progress_attachment).permit(:progress_id, :image)
    end
end

Help would be much appreciated, thanks a lot !


回答1:


My multiple image works now!

I replaced:

=f.input :image, multiple: true, name: "progress_attachments_attributes[:image][]"

by

=f.input_field :image, multiple: true, name: "progress_attachments_attributes[:image][]"



来源:https://stackoverflow.com/questions/39279796/rails-and-carrierwave-uploading-multiple-images-fails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!