Ошибки проверки не отображаются после того, как я ajax форму рельсов - PullRequest
1 голос
/ 26 сентября 2019

Я использую ajax-rails для рендеринга моей формы, и проверки перестали работать.Когда я нажимаю кнопку «Отправить», для которой необходимо выполнить проверку, проверка не вступает в силу, и в бэкэнд-журнале отображается пустая форма.Если я не использую AJAX, он работает нормально.Я не знаю, что мне не хватает.

модель

class ClockEntry < ApplicationRecord
  belongs_to :user

  validates :purpose, presence: true # I validated the attribute
end

index.html.erb

<div class="container" id="new-clock-entry">
  <%= link_to 'New Clock Entry', new_clock_entry_path, remote: true, class: 'btn btn-primary btn-sm' %>
</div>

_form.html.erb

<%= simple_form_for clock_entry, remote: true do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">
    <%= f.input :purpose %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, class: 'btn btn-primary btn-block btn-lg' %>
  </div>
<% end %>

new.html.erb

<h1>New Clock Entry</h1>

<%= render 'form', clock_entry: @clock_entry %>

<%= link_to 'Back', clock_entries_path %>

new.js.erb

$('#new-clock-entry a').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")

create.js.erb

$('#new-clock-entry form').remove();
$('#new-clock-entry a').show();
$('table#clock-entry tbody').append("<%= j render @clock_entry %>");

контроллер

def new
  @clock_entry = ClockEntry.new
end

def create
    @clock_entry = current_user.clock_entries.new(clock_entry_params)
    @clock_entry.set_time_in

    respond_to do |format|
      if @clock_entry.save
        format.js { redirect_to root_path, notice: 'Clock entry was successfully created.' }
        format.html { redirect_to @clock_entry, notice: 'Clock entry was successfully created.' }
        format.json { render :show, status: :created, location: @clock_entry }
      else
        format.html { render :new }
        format.json { render json: @clock_entry.errors, status: :unprocessable_entity }
      end
    end
  end

1 Ответ

0 голосов
/ 27 сентября 2019

@ arieljuod в разделе комментариев очень помог мне решить эту проблему.Как он упомянул во-первых, я не спрашиваю мои format to respond to js при условии else метода create.Вот что я сделал:

контроллер действия создания

Добавьте строку ниже к условию else действия создания:

format.js {render: new}

Таким образом, мое действие контроллера становится:

def create
    @clock_entry = current_user.clock_entries.new(clock_entry_params)
    @clock_entry.set_time_in

    respond_to do |format|
      if @clock_entry.save
        format.html { redirect_to @clock_entry, notice: 'Clock entry was successfully created.' }
        format.js { redirect_to root_path, notice: 'Clock entry was successfully created.' }
        format.json { render :show, status: :created, location: @clock_entry }
      else
        format.js { render :new } # Added this...
        format.html { render :new }
        format.json { render json: @clock_entry.errors, status: :unprocessable_entity }
      end
    end
  end

файл new.js.erb

Затем в файле new.js.erb после рендеринга формы :new необходимо удалить или скрыть то, что уже есть, и добавить новую форму с сообщением об ошибке.Поэтому мне пришлось удалить всю форму, указав form tag to be hidden в моем new.js.erb.Поэтому я добавляю эту строку ниже в мой new.js.erb файл:

$ ('# new-clock-entry form'). Hide (). Parent (). Append ("<% = jrender 'form', clock_entry: @clock_entry%> ")

Итак, новый файл new.js.erb теперь становится:

$('#new-clock-entry a').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")
$('#new-clock-entry form').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")

Я думаю, что это должно быть удобно всем, кто запускаетв ту же проблему.

...