2017-01-16 2 views
1

Я работаю над настройкой Carrierwave для загрузки изображений для моей вложенной модели. Прямо сейчас Rails не является ошибкой, а Carrierwave не загружает файл изображения. Я надеюсь на помощь отладки. Вот моя установка ж идея иметь модельную бюро с 1 или более DeskImages:Установка вложенной модели Carrierwave: не выгрузка файла, а не ошибка

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 %> 

Смотрите все, что я делаю неправильно? Любые указатели, чтобы помочь отладить это, приветствуются. Спасибо

+0

Вы в белый список ': images' в permitted_params? –

ответ

1

Использование вложенных форм с несущей волной всегда было сложным. Попробуем исправить вашу проблему.

Все зависит от типа столбца изображения в схеме. Было бы неплохо, если бы вы могли загрузить файл схемы и свой Gemfile. Я дам вам возможное решение без жемчужины simple_form.

Я предполагаю, что вы установили gem 'carrierwave' и что ваш столбец изображения находится в таблице 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 

Проверить сильный PARAMS в вашем 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 %> 

ПРИМЕЧАНИЕ: В случае, если вы установили, драгоценные 'carrierwave', github: 'carrierwaveuploader/carrierwave' Вещи изменится , Вам нужен либо тип столбца JSON, либо массив столбцов в БД, а в загрузчике вы должны использовать mount_uploaders :images. (множественное число) Пожалуйста, проверьте here

При отправке формы с изображением/изображениями проверьте свою консоль, если имеются параметры.Вы также можете проверить журналы в папке журнала для файла development.log

Я надеюсь, что это помогает

+0

Замечательный ответ, спасибо! – AnApprentice

+0

Добро пожаловать! Просто добавлю, что MySQL, я думаю, из версии 5.7 поддерживает JSON-хранилище и PostgreSQL, но я не уверен в SQLite. – Blackcoat77

 Смежные вопросы

  • Нет связанных вопросов^_^