Элемент формы исчезает при сбое вложенных проверок - PullRequest
0 голосов
/ 12 июня 2018

У меня есть приложение на Rails 5, и у меня проблема с проверками, использующими гем Cocoon с вложенными динамическими формами.

Когда проверка на моей модели Book завершается неудачно, и мое действие create отображает :new, поле Author исчезает из моей новой книжной формы.

Одна вещь, которую я 'мы заметили, что когда проверка не проходит, вместо передачи authors обратно в мою форму, она передает book_authors назад из-за строки @book.book_authors.build(author_id: author.id) в моем действии create.Я уверен, что это причина моей проблемы, но не знаю, как ее исправить.

books_controller.rb

class BooksController < ApplicationController
  ...

  def new
    @book = Book.new
    @book.authors.build
  end

  def create
    @book = current_user.books.create(book_params)
    params[:book][:authors_attributes].each do |k,v|
      author = Author.find_or_create_by(name: v['name'], user_id: current_user.id)
      @book.book_authors.build(author_id: author.id)
    end

    if @book.save
        redirect_to book_path(@book)
    else
      render :new
    end
  end

  private

  def book_params
    params.require(:book).permit(:title, :published_city, :description, author_ids:[])
  end

  def author_params
    params.require(:book).permit(authors_attributes: [:id, :name, :_destroy])
  end
end

book.rb

class Book < ApplicationRecord

  has_many :book_authors
  has_many :authors, through: :book_authors
  belongs_to :user

  accepts_nested_attributes_for :authors, allow_destroy: true
  validates :title, :published_city, presence: true
  validates_associated :authors, inverse_of: :book
end

book_author.rb

class BookAuthor < ApplicationRecord
  belongs_to :book
  belongs_to :author
end

author.rb

class Author < ApplicationRecord
  has_many :book_authors
  has_many :books, through: :book_authors

  validates :name, presence: true
end

new.html.erb

<%= form_for @book do |f| %>
  <%= f.text_field :title, required: true %>
  <%= f.text_area :description %>
  <div id='authors'>
    <%= f.fields_for :authors do |author| %>
      <%= render 'author_fields', :f => author %>
    <% end %>
    <div class='links'>
      <%= link_to_add_association 'Add another author', f, :authors %>
    </div>
  </div>
  <%= f.text_field :published_city %>
  <%= f.submit %>
<% end %>
...