Проверка формы Rails с вызовом и подтверждением базы данных

#ruby-on-rails #validation #jquery #confirm

#ruby-on-rails #проверка #jquery #подтвердите

Вопрос:

У меня есть форма, используемая для создания команды (модель Team).

Форма добавляет участников в команду (через модель TeamMember).

Каждая команда работает в компании. Все пользователи принадлежат компании.

В настоящее время у меня есть проверка модели члена команды, которая не позволяет пользователю стать членом команды, когда пользователь работает в другой компании, чем работает команда.

Недавно меня попросили изменить эту функциональность, поскольку бывают случаи, когда команде необходимо добавить участника, который работает в другой компании.

Моя простая проверка теперь стала сложной.

Теперь мне нужно предоставить предупреждение, когда предлагаемый член команды работает в другой компании, и дать пользователю возможность подтвердить (да / нет), все ли в порядке, прежде чем сохранять изменения.

Каков чистый, удобный для rails способ добиться этого? Я полагаю, что есть решение Ajax (возможно, лайтбокс), но я не уверен, что это лучший способ его реализации или у кого-то уже есть умный камень / плагин для решения этой ситуации.

Ответ №1:

Я бы использовал для этого пользовательскую проверку, как вы сейчас, и добавил в модель изменяемый атрибут, который не сохраняется в БД. Например:

 class TeamMember < ActiveRecord::Base
  attr_accessor :user_confirmed
  after_intialize :setup

  def setup
    self.user_confirmed = false
  end
end
 

Что вам нужно сделать, это добавить проверку в свой метод проверки, если self.user_confirmed имеет значение false. Если это так, в дополнение к описанному выше отношению к БД, сделайте его недействительным. Затем в вашем представлении добавьте оператор if:

  <% if @team_member.errors[:key_you_use_to_add_to_base].first == "Error Message" %>
    <%= f.label :user_confirmed, "User works for another company, are you sure?" %>
    <%= f.check_box :user_confirmed, {}, "true", "false" %>
 <% end %>
 

Имейте в виду, поскольку метод check_box использует строки, вам нужно будет преобразовать результат этого атрибута в хэше ваших параметров в логическое значение.

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