将用户重定向到注册
使用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