用户未登录 Rails 时如何获得 root 视图?

aks*_*aks 1 ruby-on-rails devise

我正在构建一个 rails 应用程序,我使用 Devise 进行身份验证。我想在用户访问时显示产品第一页,www.mydomain.com而不是www.mydomain.com/users/sign_in设计默认页面!

我还想在用户登录时显示不同的根视图。这感觉就像一个非常常见的用例,有没有简单的方法来做到这一点?这是在文档中还是有人可以帮我解决这个问题?

max*_*max 8

您可以使用authenticatedDevise 提供的路由帮助程序在路由上添加约束,以便它们仅对登录用户可用:

Rails.application.routes.draw do
  devise_for :users

  authenticated :user do
    root 'secret#index', as: :authenticated_root
  end

  root "home#index"
end
Run Code Online (Sandbox Code Playgroud)

与@Sergio Tulentsev 的答案相比的优势在于,这不会导致重定向或在控制器中需要任何额外的逻辑。

但是,您的应用程序重定向到的原因/users/sign_in很可能是您before_action :authenticate_user!在 ApplicationController中使用,以便处理根路径的控制器需要身份验证并重定向到登录。您可以通过以下方式解决此问题(同时保留默认设置的安全性)跳过回调:

class HomeController < ApplicationController
  skip_before_action :authenticate_user!
  # ...
end
Run Code Online (Sandbox Code Playgroud)

这适用于任何不需要身份验证的控制器。您可以使用onlyexcept选项跳过特定操作。请记住,白名单比黑名单更安全。