Rails 4设计 – 如果未经过身份validation,则重定向用户

authenticate_user! 在comments_controller中。

before_action :authenticate_user! 

当用户点击创建评论时,他们现在会重定向到users / sign_in页面。

但是,我想将它们重定向到root_url并发出通知登录。主页上有登录按钮(FB和G +)。

我看过这个 ,但是当我实现它时,我只得到一个具有相同URL的黑色页面和已完成401未授权

你可以添加authenticate_user! application_controller.rb方法

 class ApplicationController < ActionController::Base protected def authenticate_user! redirect_to root_path, notice: "You must login" unless user_signed_in? end end 

comments_controller.rb

  before_filter :loged_in?, :only => [:create, :edit, :destroy] #customize to fit your needs private def loged_in? redirect_to root_path, notice: 'Your have to log in' unless current_user end 

它将检查current_user是否存在,如果用户已登录则会检查,否则会在给定通知的情况下重定向到根路径。

我向Devise wiki添加了一个页面,显示了使用失败应用程序执行此操作的正确方法: 如果未经身份validation,则重定向到新注册(注册)路径

关键是覆盖route方法,如下所示:

 # app/lib/my_failure_app.rb class MyFailureApp < Devise::FailureApp def route(scope) :new_user_registration_url end end 

然后让Devise使用你的失败应用程序:

 # config/initializers/devise.rb config.warden do |manager| manager.failure_app = MyFailureApp end 

这种方法比覆盖authenticate_user!更好authenticate_user! 在你的控制器中,因为它不会破坏Devise所做的很多“幕后”工作,比如存储尝试过的URL,这样用户就可以在成功登录后重定向。

具有多种用户类型

如果您有AdminUser设计资源,您可能希望为管理员保留默认的“新会话”function。 您可以通过检查正在处理的范围类型来轻松完成此操作:

 # app/lib/my_failure_app.rb class MyFailureApp < Devise::FailureApp def route(scope) scope.to_sym == :user ? :new_user_registration_url : super end end