Разработать: перенаправление при неудачной регистрации? - PullRequest
13 голосов
/ 05 июня 2011

Я пытаюсь перенаправить пользователей, которые не прошли регистрационную форму (например, они ввели имя пользователя, которое уже занято, они оставили поле пустым и т. Д ...)

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

class CustomFailure < Devise::FailureApp 

   def redirect_url 
      root_path 
   end 

   def respond 
      if http_auth? 
      http_auth 
   else 
      redirect 
   end 
 end

Однако я застрял на том, как настроить это для сбоя регистрации.В идеале я хотел бы просто перенаправить их обратно / в root_path, есть идеи?Спасибо!

Ответы [ 4 ]

19 голосов
/ 05 июня 2011

Возможно, вам потребуется создать подкласс Devise::RegistrationsController и переопределить действие создания. Просто скопируйте метод create из здесь и измените перенаправление при неудачном сохранении.

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController


  def create
    # modify logic to redirect to root url
  end


end 

Измените ваши маршруты, чтобы сообщить Devise об использовании вашего контроллера:

# config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
7 голосов
/ 09 февраля 2017

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

  1. отправляет форму в пустой форме
  2. отправляет уже существующее электронное письмо. Ниже, как я справился с этим.

Сначала создайте контроллер с именем RegistrationsController, который наследуется от Devise :: RegistrationsController, вот так:

 class RegistrationsController < Devise::RegistrationsController
 end

Внутри этого контроллера вы будете переопределять метод create в devise. Перейдите на страницу devise github здесь, https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb, чтобы просмотреть метод create и скопировать код в этом методе. Затем создайте закрытый метод, чтобы переопределить возвращаемый статус последнего блока оператора if. Ваш контроллер должен выглядеть так,

class RegistrationsController < Devise::RegistrationsController


 def create
   build_resource(sign_up_params)

   resource.save
   yield resource if block_given?
  if resource.persisted?
    if resource.active_for_authentication?
      set_flash_message! :notice, :signed_up
      sign_up(resource_name, resource)
      respond_with resource, location: after_sign_up_path_for(resource)
    else
      set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
      expire_data_after_sign_in!
      respond_with resource, location: after_inactive_sign_up_path_for(resource)
    end
  else
    clean_up_passwords resource
    set_minimum_password_length
    response_to_sign_up_failure resource    
  end
  end

private

def response_to_sign_up_failure(resource)
  if resource.email == "" && resource.password == nil
    redirect_to root_path, alert: "Please fill in the form"
  elsif User.pluck(:email).include? resource.email
    redirect_to root_path, alert: "email already exists"
  end
end
 end

Это должно работать.

5 голосов
/ 24 июля 2014

Совет:

Чтобы сохранить сообщения об ошибках Flash, добавьте эту строку перед redirect_to в вашем переопределении

    resource.errors.full_messages.each {|x| flash[x] = x}

Так что в вашем registrations_controller.rb:

def create
    build_resource(sign_up_params)

    if resource.save
        yield resource if block_given?
        if resource.active_for_authentication?
            set_flash_message :notice, :signed_up if is_flashing_format?
            sign_up(resource_name, resource)
            respond_with resource, location: after_sign_up_path_for(resource)
        else
            set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
            expire_data_after_sign_in!
            respond_with resource, location: after_inactive_sign_up_path_for(resource)
        end
    else
        clean_up_passwords resource
        resource.errors.full_messages.each {|x| flash[x] = x} # Rails 4 simple way
        redirect_to root_path 
    end
end
0 голосов
/ 05 февраля 2019

В config / rout.rb:

devise_scope :user do
   get '/users', to: 'devise/registrations#new'
end
...