将用户重定向到注册

使用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' 

你要找的是一个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 

Devise使用warden进行身份validation。 因此,要覆盖整个行为,您必须覆盖devise要求它处理身份validation失败的方式。

创建一个扩展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 

将其添加到您的config/initializers/devise.rb初始化程序config/initializers/devise.rb

 config.warden do |manager| manager.failure_app = RedirectToSignUp end 

我相信这将解决您的问题,并将您重定向到您所在的页面,因为您只覆盖重定向路由。

我没试过,但这似乎是你在寻找的。 请注意,它说它已过时。 因此,如果您想了解正在发生的事情,您应该看到源代码。

浏览Devise的源代码( 这个和这个 ),我的猜测是你可以扩展Devise::RegistrationsController然后覆盖after_sign_up_path_for方法为stored_location_for(:user) || root_path stored_location_for(:user) || root_path

我喜欢使用设计设置用户区的方式是:

  # 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 

我所有的其他用户控制器看起来都像它一样inheritance

 #app/controllers/users/users_controller.rb class Users::UsersController < UserController ... end 

我希望这个对你有用。

这很简单

用户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