Перенаправление пользователя для регистрации
Используя before_action :authenticate_user!
, чтобы проверить, зарегистрирован ли пользователь. Но он отправляет пользователей в login
вместо signup
.
Пробовал различные способы перенаправления пользователя на signup
вместо login
, но после он не отправил пользователя на исходную страницу.
Как я могу отправить пользователя для регистрации и перенаправить пользователя обратно на исходную страницу?
Попытки:
before_filter :auth_user
def auth_user
redirect_to new_user_registration_url unless user_signed_in?
end
Файл маршрутов
Rails.application.routes.draw do
devise_for :installs
resources :orders
resources :products
devise_for :users
get 'dashboard' => 'pages#dashboard'
get 'contact' => 'pages#contact'
get 'cart' => 'carts#index'
root 'pages#home'
Ответы
Ответ 1
То, что вы ищете, это referer
.
При работе вашего before_filter вы можете переопределить Devise after_sign_up_path_for
:
def after_sign_up_path_for(user)
request.referer
end
ИЗМЕНИТЬ
Так как request.referer
как-то не работает, я думаю, вы можете пойти с решением на основе сеанса:
def auth_user
session[:before_sign_up_path] = request.fullpath
redirect_to new_user_registration_url unless user_signed_in?
end
def after_sign_up_path_for(user)
session[:before_sign_up_path]
end
Ответ 2
В Devise используется средство проверки подлинности. Таким образом, чтобы переопределить все поведение, вы должны переопределить способ devise
попросить его обработать ошибки аутентификации.
Создайте класс, который расширяет Devise::FailureApp
class RedirectToSignUp < Devise::FailureApp
def redirect_url
new_user_registration_url
end
def respond
if http_auth?
http_auth
else
redirect_to new_user_registration_url
end
end
end
Добавьте это в свой devise
инициализатор config/initializers/devise.rb
config.warden do |manager|
manager.failure_app = RedirectToSignUp
end
Я считаю, что это решит вашу проблему и перенаправит вас на страницу, на которой вы были, поскольку вы переопределяете только маршрут перенаправления.
Ответ 3
Я не пробовал, но это, похоже, то, что вы ищете. Обратите внимание, что в нем говорится, что он устарел. Поэтому вы должны увидеть исходный код, если хотите понять, что происходит.
Перемещение по исходному коду Devise (this и this) я предполагаю, что вы можете расширить Devise::RegistrationsController
, а затем переопределить метод after_sign_up_path_for
как stored_location_for(:user) || root_path
.
Ответ 4
способ, которым я хотел бы настроить свою область пользователей с помощью devise:
# config/routes.rb
devise_for :users, :controllers => {
registrations: 'users/registrations',
sessions: "users/sessions",
passwords: 'users/passwords',
confirmations: 'users/confirmations'
}
authenticate :provider do
namespace :providers do
....
end
end
Затем у меня есть контроллер, который управляет всеми другими контроллерами пользователей, такими как
#app/controllers/user_controller.rb
class UserController < ApplicationController
before_filter :authenticate_user!
layout 'users/default'
before_filter :check_user_active
private
def check_user_active
unless current_user.active
flash[:notice]= t(:user_not_active)
sign_out current_user
redirect_to new_user_session_path
end
end
end
все мои другие пользовательские контроллеры выглядят унаследованными от него, например
#app/controllers/users/users_controller.rb
class Users::UsersController < UserController
...
end
Я надеюсь, что это поможет.
Ответ 5
Это очень просто
Пользователь store_location_for
метод
Как
before_filter :auth_user
def auth_user
unless user_signed_in?
store_location_for(:user, request.fullpath)
redirect_to new_user_registration_url
end
end