Добавить диалоговое окно подтверждения данных в Rails Controller - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть приложение, в котором я хочу предупредить людей, если они создают дубликат author. У меня установлен фильтр before_action для метода create, который выглядит следующим образом:

  def check_for_duplicates
    @duplicates = Author.where(first_name: @new_author.first_name, last_name: @new_author.last_name)
    if @duplicates.count != 0
      ## THE NEXT LINE IS WHAT I NEED TO FIGURE OUT ##
      data: {confirm: "You already have an author with this name.  Are you sure you want to create another one?"}
    end
  end

В настоящее время я получаю следующую ошибку сервера:

SyntaxError - syntax error, unexpected ':', expecting keyword_end
      data: {confirm: "You already have ...
          ^
/Users/lizbayardelle/Code/MMR/app/controllers/authors_controller.rb:80: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
...irect_to authors_path, notice "Sorry, you don't have permiss...
...                              ^:
  app/controllers/authors_controller.rb:73:in `'

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

Я проверил другие вопросы SO (например, this ), и все кажется включает в себя довольно сложное решение на странице javascript.

Есть ли удобный способ сделать это внутри контроллера?

1 Ответ

0 голосов
/ 11 февраля 2020
Атрибуты

data-confirm действительно простой способ использовать обработчики событий, которые Rails U JS предоставляет в javascript. Вы не можете вызвать диалог подтверждения из серверной части, и вся идея просто обратная.

Как уже предлагалось, если вы хотите выполнить эту проверку из внешнего интерфейса, вам нужен маршрут, где вы можете найти пользователей по имени и фамилия. Вам даже не нужно возвращать JSON. Просто сделайте запрос HEAD и проверьте, имеет ли статус 200 OK или 302 FOUND или 404. NOT FOUND.

Если вам не удается это сделать, вы действительно хотите обработать это на стороне сервера - просто добавьте атрибут флага и пользовательская проверка модели:

class Author < ApplicationRecord
  # this creates an attribute without a db column.
  attribute :dup_warning_displayed, :boolean, default: false
  validate :name_duplication, unless: :dup_warning_displayed?, on: :create
  # ...

  def name_duplication
    if self.class.where(first_name: first_name, last_name: last_name).any?
      errors.add(:base, "You already have an author with this name.  Are you sure you want to create another one?")
      dup_warning_displayed = true
    end
  end
end

Затем необходимо передать атрибут dup_warning_displayed через форму:

<%= form_for(@author) do |f| %>
   # ...
   <%= f.hidden_field :dup_warning_displayed if @author.dup_warning_displayed? %>
   # ... 
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...