Как отобразить ошибки из формы без модели (form_tag или form_with) в Rails? - PullRequest
0 голосов
/ 26 апреля 2019

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

render 'omniauth_callbacks/confirm_email'

verify_email.html.slim выглядит так - у него нет модели:

h1 Enter your email
= form_with(url: confirm_email_path, method: :post) do |f|
    = f.label :Email
    = f.email_field :email
  = f.submit 'Confirm email'

Кнопка «Отправить» приводит к методу, который создает ожидающего пользователяавторизация и отправка письма с подтверждением на указанный адрес электронной почты.

 def confirm_email
    pending_user = User.find_or_init_skip_confirmation(params[:email])
    if pending_user 
      authorization = pending_user.authorizations.create!(provider: session[:auth]['provider'], uid: session[:auth]['uid'], 
                                                linked_email: params[:email], confirmation_token: Devise.friendly_token[0, 20],
                                                confirmation_sent_at: Time.now)

      OauthMailer.send_confirmation_letter(authorization).deliver_now
      redirect_to root_path, notice: "Great! Now confirm your email, we've sent you a letter!"
    else
      render 'omniauth_callbacks/confirm_email', alert: "We couldn't verify your email, please try again later"
    end 
  end

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

ActiveRecord :: RecordInvalid (Проверка не удалась: Uid уже был занят) - когда письмо с подтверждением уже было отправлено на электронную почту.или

ActiveRecord :: RecordNotSaved (Вы не можете вызвать create, если родитель не сохранен) - когда электронное письмо было пустым, и я не мог создать ожидающего пользователя.

Обычно я использовал бы стандартный render 'shared/errors', resource: resource, но для этого требуется ресурс, которого у меня нет в форме.

1 Ответ

0 голосов
/ 26 апреля 2019

Оберните все это в структуру начала / спасения:

def confirm_email
  begin 
    pending_user = User.find_or_init_skip_confirmation(params[:email])
    if pending_user
      authorization = pending_user.authorizations.
                                   create!(provider: session[:auth]['provider'],
                                           uid: session[:auth]['uid'], 
                                           linked_email: params[:email],
                                           confirmation_token: Devise.friendly_token[0, 20],
                                           confirmation_sent_at: Time.now)

      OauthMailer.send_confirmation_letter(authorization).deliver_now
      redirect_to root_path, notice: "Great! Now confirm your email, we've sent you a letter!"
    else
      raise "We couldn't verify your email, please try again later"
    end
  rescue Exception => e
    render 'omniauth_callbacks/confirm_email', alert: "ERROR: #{e.message}"
  end 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...