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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 是否可以在Rails中指定两个根页面(一个用于匿名用户另一个用于登录用户)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个具有静态页面和动态页面(与产品相关)的产品.这两类页面都有不同的发布生命周期.与设计师合作的营销团队,发布静态页面和产品页面由工程团队发布.

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

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

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

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

我想知道以下内容

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

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

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

解决方法

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

send_file documentation

并且,根据每个操作和模板之间的对应关系,您可以进一步将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方法.

猜你在找的Ruby相关文章