Задать вопрос
@weare138

Как сделать мультизагрузку изображений с помощью Carrierwave?

Привет!Собственно вопрос в названии топика, использую carrierwave.Есть класс image_uploader
class ImageUploader < CarrierWave::Uploader::Base

  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

end


И есть модель photo.rb к которой примонтирован загрузчик
class Photo < ActiveRecord::Base
  mount_uploader :image, ImageUploader
  belongs_to :photoable, polymorphic: true
  belongs_to :post
end


так же есть модель post.rb которая связана полиморфной ассоциацией в моделью photo.rb
class Post < ActiveRecord::Base
  has_many :comments
  has_many :post_attachments
  validates :title, :body, presence: true
  has_many :photos, as: :photoable
  accepts_nested_attributes_for :photos
end


и есть паршиал с формой для этой модели (post) _form.html.haml
= form_for [:admin, @post], html: { multipart: true } do |f|
  = f.fields_for :photos do |photo_fields|
    = photo_fields.file_field :image, multiple: true
  = f.text_field :title, class: "form-control", placeholder: "Заголовок"
  = f.text_area :body, rows: 12, class: "form-control", placeholder: "Сообщение"
  .pull-right
    = f.submit "Отправить", class: "btn btn-success"


и все это дело работает только для одного изображения, когда пытаюсь загрузить несколько картинок то лог сервера ругается на Unpermitted parameters: image

как исправить?
  • Вопрос задан
  • 3765 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Freika
@Freika
Senior Ruby on Rails developer
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vsuhachev
Проблема в том что вы не создаете много объектов Photo каждый с одной картинкой (как вы описали в вашей модели), а создаете один Photo и пытаетесь воткнуть в него несколько файлов картинок

Чтобы все работало так как вы хотите вам нужно
1) В форме иметь просто одно поле с картинками, не забудьте его разрешить для strong parameters
= form_for [:admin, @post], html: { multipart: true } do |f|
    = f.file_field :images, multiple: true


2) В методе контроллера перебрать массив params[:images] и для каждого изображения создать свой объект Photo и привязать его к родительскому Post
params[:images].each do |image|
  @post.photos.build(image: image)
end
Ответ написан
Prognosticator
@Prognosticator
TODO: Здесь будут ворованные умные мысли, типа мои
Комментировать
viktorvsk
@viktorvsk
patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-s...
Не сказал бы, что именно по теме, но прочтите. Даже если не поймете, сохраните на будущее
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы