@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

как исправить?
  • Вопрос задан
  • 3758 просмотров
Решения вопроса 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...
Не сказал бы, что именно по теме, но прочтите. Даже если не поймете, сохраните на будущее
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы