Подтвердить что ты не робот

Придумать: перенаправить при сбое регистрации?

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

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

class CustomFailure < Devise::FailureApp 

   def redirect_url 
      root_path 
   end 

   def respond 
      if http_auth? 
      http_auth 
   else 
      redirect 
   end 
 end

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

4b9b3361

Ответ 1

Вам, вероятно, потребуется подкласс Devise::RegistrationsController и переопределить действие create. Просто скопируйте метод 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"}

Ответ 2

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

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

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

 class RegistrationsController < Devise::RegistrationsController
 end

Внутри этого контроллера вы будете переопределять созданный метод. Перейдите на страницу разработки github здесь, https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb, чтобы просмотреть метод создания и скопировать код в этом методе. Затем создайте закрытый метод, чтобы переопределить возвращаемый статус последнего блока оператора 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

Он должен работать.

Ответ 3

Совет:

Чтобы сохранить сообщения об ошибках Flash, добавьте эту строку перед перенаправлением_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

Ответ 4

В config/rout.Rb:

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