是否可以在Rails中指定两个根页面(一个用于匿名用户另一个用于登录用户)

Har*_*tty 7 ruby-on-rails

我正在构建一个具有静态页面和动态页面(与产品相关)的产品.这两类页面都有不同的发布生命周期.与设计师合作的营销团队,发布静态页面和产品页面由工程团队发布.

静态页面驻留在public/home,它们是自包含的.除了提供链接之外,他们不需要访问Rails基础结构.

在此设置中,我试图实现以下行为:

  • 当未经身份验证的访问者启动http://www.xyz.com时,应该将用户带到静态登录页面.

  • 当经过身份验证的访问者启动http://www.xyz.com时,应该将用户带到产品登录页面(LandingsController,索引操作).

在我当前的实现中,我检查用户是否在Rails世界中进行了身份验证并呈现静态页面或产品页面.

我想知道以下内容:

1)你如何处理这种情况?

2)有没有办法避免进入静态主页的Rails堆栈.

3)是否有root_path方法的自定义,以根据上下文返回不同的根

wup*_*tah 3

不幸的是,Rails 的路由只能根据请求中的某些内容将请求路由到不同的控制器,从而使每个请求的会话数据无法访问。您当前的实施无疑是最常见的策略。我猜是这样的:

def index
  if logged_in?
     # any logged in logic you need.
  else
     render :file => 'public/home', :layout => false
  end
end
Run Code Online (Sandbox Code Playgroud)

重构它以使其感觉不那么“讨厌”的唯一方法是将渲染调用移动到before_filter. 由于过滤器将具有rendered?,因此您的操作根本不会被调用。当然,您也可以redirect_to在 before 过滤器中选择另一个位置来存储经过身份验证(或未经身份验证)的请求,这将完全解决问题。

您唯一能做的就是基于会话 cookie 不存在。

  1. 编写一个中间件组件或 Rack 应用程序(等),在不存在会话 cookie 的情况下显式处理请求。同样,您可以使用中间件重写请求,然后将其传递到应用层。
  2. 使用与 #1 类似的策略,但通过 Web 服务器配置(Apache 或 nginx)来实现,完全避免使用 Rails 应用程序。

但是,某人绝对有可能拥有会话但未登录(例如,如果他们转到您没有以这种方式处理的另一个页面),或者甚至拥有无效的会话数据,因此您将无法实际上消除你现在拥有的代码。这些更改只会提高无会话请求的性能,但除非这些页面导致重大问题(我对此表示怀疑),所以我不建议这样做。