Добавить несколько изображений с Cocoon Gem

Во-первых, я должен сказать, что я новичок в рельсах, так что извините за вопрос новичка. У меня есть модель "Post", в которой есть много картинок

class Post < ActiveRecord::Base

  has_many :pictures, :dependent => :destroy

  accepts_nested_attributes_for :pictures, :allow_destroy => true, :reject_if => lambda { |t| t['pictures'].nil? }


  belongs_to :user 

  monetize :price

  validates :title, :brand, :model, :price, :year, presence: true

end

и моя модель изображения:

class Picture < ActiveRecord::Base
  belongs_to :post

  has_attached_file :image,
    :path => ":rails_root/public/images/:id/:filename",
    :url  => "/images/:id/:filename",
    styles: { medium: "600x600>"}


  validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
  validates :image, presence: true

end

Мое создание это:

def create
  @post = current_user.post.build(post_params)

  respond_to do |format|
    if @post.save
      if params[:images]

        params[:images].each { |image|
        @post.pictures.create(image: image)
        }
      end
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.json { render :show, status: :created, location: @post }
   else
      format.html { render :new }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end 

Мои сильные параметры:

  def post_params
  params.require(:post).permit(:title, :decription, :brand, :model, :price,  pictures_attributes: [ :image, :_destroy])
end

Моя форма:

 = simple_form_for @post, html: { multipart: true } do |f|


.form-group
  = f.input :title, input_html: { class: 'form-control'}

.form-group
  = f.input :brand, input_html: { class: 'form-control'}

.form-group
  = f.input :model, input_html: { class: 'form-control'}

.form-group
  = f.input :description, input_html: { class: 'form-control'}

.form-group
  = f.input :year,  input_html: { class: 'form-control'} 

.form-group
  = f.input :price,  input_html: { class: 'form-control'}



.form-group
  = f.simple_fields_for :pictures do |pic|
    = render 'picture_fields', f: pic

.links
  = link_to_add_association 'add pictures', f, :pictures, class: "btn btn-default"



= f.button :submit, class: "btn btn-primary"

а также

.form-inline.clearfix
.nested-fields
    = f.file_field :picture
    = link_to_remove_association "delete", f

Когда я нажимаю кнопку "Отправить", сообщение сохраняется, но не может выполнить итерацию, чтобы добавить фотографии в шоу. Есть ли ошибка в моем коде? Есть ли решение, чтобы узнать, сохранены ли изображения? Когда я использую консоль ruby ​​@post = Post.last и @post.pictures, которые дают мне это:

Загрузка изображения (2,0 мс) ВЫБЕРИТЕ "картинки".* ИЗ "картинок" ГДЕ "картинки". "Post_id" =? [["post_id", 34]] => #

1 ответ

Здесь (по крайней мере) три вещи не так:

Во-первых, вам не нужно делать это (если, конечно, нет других способов использовать тот же контроллер). params[:images] всегда ноль:

if params[:images]
  params[:images].each { |image|
    @post.pictures.create(image: image)
  }
end

Во-вторых, кажется, ваша модель имеет атрибут image однако в вашей форме у вас есть:

= f.file_field :picture

Честно говоря, я ожидал бы, что это вызовет исключение, и это, вероятно, является причиной вашей проблемы. (Если это так - вы всегда должны публиковать любые исключения, которые вы получили вместе с вашим вопросом).

И третье: это определенно не проблема, которую вы пытаетесь решить, но, скорее всего, ваш следующий вопрос, который вы отправите после того, как этот вопрос будет решен: вы пропали id в pictures_attributes в ваших сильных параметрах - это приведет к дублированию всех существующих изображений при каждой отправке формы + сделает невозможным удаление изображения.

РЕДАКТИРОВАТЬ:

Пара других потенциальных проблем. Вы должны всегда оборачивать ассоциации коконов в какую-то обертку - JavaScript позади button_to_add_association ожидает определенную структуру DOM, которая может быть переопределена, но проще просто перейти по умолчанию.

 #pictures
  .form-group
    = f.simple_fields_for :pictures do |pic|
      = render 'picture_fields', f: pic

  .links
    = link_to_add_association 'add pictures', f, :pictures, class: "btn btn-default"

Другая потенциальная проблема - ваша частичная. link_to_remove_association ищет ближайшего родителя с классом nested-fields и удаляет его (если это не существующая запись, в этом случае он добавляет некоторые дополнительные вещи и скрывает их, не имеет значения). Проблема в том, что если вы добавите 5 фотографий, а затем удалите все из них - у вас останется 5 .form-inline.clearfix рюшечки. Я не вижу ваш CSS, но это может привести к тому, что ваше мнение будет непоследовательным / неправильным.

Другие вопросы по тегам