AJAX-форма Rails не переполняет поля после неудачной проверки - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть приложение Rails 5.2.0 с simple_form gem.В настройке ниже я создаю новый Note с формой AJAX.Я могу просто создать новую запись.

Однако, когда проверка формы завершается неудачно (атрибуты title и body), она повторно отображает частичную _new.html.erb, но без заполнения полей формы данными.который присутствовал до того, как пользователь отправил форму.

Как сохранить данные после сбоя проверки?

book.rb

class Book < ApplicationRecord
  has_many :notes
end

note.rb

class Note < ApplicationRecord
  belongs_to :book

  validates :title, :body, presence: true
end

notes_controller.rb

def new
  @note = Note.new

  @book = Book.find(params[:book_id])

  respond_to do |format|
    format.html {}
    format.js {}
  end
end

def create 
  @book = Book.find(params[:book_id])
  @note = @book.notes.create(note_params)

  if @note.save
    respond_to do |format|
      format.html { redirect_to user_book_path(id: @book.id, user_id: current_user.slug) }
      format.js { redirect_to user_book_path(id: @book.id, user_id: current_user.slug) }
    end
  else
    respond_to do |format|
      format.html { render :new }
      format.js {render :new}
    end
  end
end

_new.html.erb

<%= simple_form_for [book, Note.new], remote: true do |f| %>
  <%= f.input :title, placeholder: "title", label: false, autofocus: true %>
  <%= f.input :body, placeholder: "title", label: false, autofocus: true %>
  <%= f.button :submit, "Create note" %>
<% end %>

new.js.erb

$("#show-edit-note").html("<%= j render partial: 'notes/new', locals: { book: @book, note: @note } %>");

1 Ответ

0 голосов
/ 01 февраля 2019

Я предполагаю, что проблема в том, что вы используете Note.new здесь:

<%= simple_form_for [book, Note.new], remote: true do |f| %>
  <%= f.input :title, placeholder: "title", label: false, autofocus: true %>
  <%= f.input :body, placeholder: "title", label: false, autofocus: true %>
  <%= f.button :submit, "Create note" %>
<% end %>

Таким образом, у вас никогда не будет никаких значений в форме, потому что форма всегда основана на новом Note объект.

Поскольку вы создаете @note как в своих действиях new, так и create, я считаю, что вы должны делать:

<%= simple_form_for [book, @note], remote: true do |f| %>
  <%= f.input :title, placeholder: "title", label: false, autofocus: true %>
  <%= f.input :body, placeholder: "title", label: false, autofocus: true %>
  <%= f.button :submit, "Create note" %>
<% end %>

Я не использую simple_formтак что это выстрел в темноте.

Кроме того, как заявляет Джон Галлахер в комментариях, это:

@note = @book.notes.create(note_params)

На самом деле должно быть так:

@note = @book.notes.build(note_params)

При создании чего-то вроде @note обычно используется .build вместо .create, потому что .build не сохраняет @note, что делает условное выражение if @note.save немного более разумным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...