rails 5中经过身份验证和未经身份验证的路由

时间:2018-02-20 03:58:38

标签: ruby-on-rails devise

我已将rails 4应用程序更新到Rails 5,但我无法在rails 5上设置经过身份验证和未经身份验证的路由。

在rails 4中:

unauthenticated do
   root to: "home#index", as: :unauthenticated_root
end

authenticated :user do
  root :to => "home#dashboard"
end

但是如何设置rails 5应用程序

2 个答案:

答案 0 :(得分:0)

我认为您找到的解决方案是user_signed_in然后重定向到home#dashboard其他"home#index",对吗?然后

首先,请参阅此解决方案,如果不起作用,请说明How To: Define a different root route for logged in out users,然后转到下面。

的routes.rb

root to: "home#index", as: :unauthenticated_root
get 'dashboard', to: "home#dashboard" #=> dashboard_path

在您的索引操作上使用如下

def index
    redirect_to dashboard_path if user_signed_in?
end

使用控制器顶部

before_action :authenticate_user!, except: [:index]

它将被设置为需要dashboard的身份验证以及index以外的其他操作,您也可以像这样使用

before_action :authenticate_user!, only: [:dashboard]

将仅设置dashboard操作的身份验证。

user_signed_in?authenticate_user!是回调方法,如果你使用devise然后它默认存在,如果你没有使用devise那么我相信你有自己的回调方法只是替换它。

评论后完全格式化

class HomeController < ApplicationController
    before_action :authenticate_user!, except: [:index]

    def index 
        redirect_to dashboard_path if user_signed_in?
    end

    def dashboard 
    end

    def other_action 
    end

    .....
end

耙路后

unauthenticated_root GET    /                       home#index
dashboard GET               /dashboard(.:format)    home#dashboard

<强> Update after comment

如果您有ajax登录信息,请按照此SO question

进行操作

您应该覆盖设计创建方法并通过正确呈现视图来管理其中的情况,否则,正如您在设计的默认创建方法中所看到的,如果未执行会话创建,它将只重定向您渲染create.js

您可以在控制器文件夹中覆盖设计控制器并命名为registrations_controller.rb,如下所示

class RegistrationsController < Devise::RegistrationsController
    # POST /resource
    def create
        super
    end
end

路线看起来像

devise_for :users, :controllers => {:registrations => 'registrations'}

希望有所帮助

答案 1 :(得分:0)

这是使用路线约束的绝佳应用程序。请考虑以下内容:

  # routes.rb

  scope module: 'authenticated', constraints: AuthConstraint.new { |user| user.present? } do
    # Management dashboard
    root 'dashboards#index'
  end

  root 'home#index'

约束在app/constraints/auth_constraint.rb文件中定义,可以根据需要进行配置。例如。

# app/constraints/auth_constraint.rb

class AuthConstraint
  def initialize(&block)
    @block = block || ->(_) { true }
  end

  def matches?(req)
    user = current_user(req)
    user.present? && @block.call(user)
  end

  def current_user(req)
    User.find_by_id(session[:user_id])
  end
end

这是一种基于任何所需变量(角色,身份验证等)定义路由访问权限的灵活方法

以下是Rails文档中约束的链接:https://guides.rubyonrails.org/routing.html#specifying-constraints