静态页面位于public / home中,它们是自包含的.除了提供链接之外,他们不需要访问Rails基础结构.
在此设置中,我试图实现以下行为:
>当未经身份验证的访问者启动http://www.xyz.com时,应将用户带到静态登录页面.
>当经过身份验证的访问者启动http://www.xyz.com时,应将用户带到产品登录页面(LandingsController,索引操作).
在我当前的实现中,我检查用户是否在Rails世界中进行了身份验证并呈现静态页面或产品页面.
我想知道以下内容:
1)你如何处理这种情况?
2)有没有办法避免进入静态主页的Rails堆栈.
解决方法
1) How do you handle such scenarios?
常见的答案如下:
class LandingsController < ApplicationController before_filter :login_required def index ... end ... private def login_required if not_logged_in? # This methods depends on your authentication strategy send_file "/your/static/path/#{params[:action]}",:type => "application/html charset=utf8;" return false # Halt chain end end
并且,根据每个操作和模板之间的对应关系,您可以进一步将login_required方法抽象到ApplicationController中,并验证文件是否存在.
2) Is there a way to avoid entering the Rails stack for static pages
是.你必须接受我的话,因为我自己没有这样做,但你可以使用Rack middleware来做到这一点. Here is an example如何做类似的事情,除了不是重定向,你将静态地提供文件(只需将文件头和File.read的结果设置为内容)这取决于你正在使用的身份验证库,虽然.
3) Is there a customization for the root_path method to return different
root based on the context
您无法定义条件路由(即,在routes.rb文件中定义多个路由),但您可以覆盖ApplicationController中的root_url方法,假设您在路径定义中使用了命名路径根.就像是
class ApplicationController def root_url(*options) if logged_in? "/return/something/custom" else super(*options) end end end
然而,这听起来真是一个坏主意,因为1)你应该指向同一个网址,并让控制器处理请求(你的链接应该是盲目的你带到哪里),2)它可能会破坏其他的东西依赖于root_url和root_path方法.