routes.rb中的ROR 3条件

时间:2011-04-16 22:27:40

标签: ruby-on-rails-3 logging routes conditional

有没有办法在routes.rb中指定条件语句 - 我希望root_path取决于用户是否已登录。也许有其他方法可以实现这个目标?

谢谢!

3 个答案:

答案 0 :(得分:2)

实际上我认为你可以使用高级约束来记录here ...

您将定义def matches?(request)以检查用户是否已登录,并在使用登录约束时使用两个路由,而在不使用时使用一个路由。 虽然我不确定在执行自定义约束时会话是否可用。

虽然我同意SpyrosP,但最好在Controller中进行。

答案 1 :(得分:0)

不,你不能这样做。路线不依赖于基于型号代码的条件。任何人都可以打电话给路线,所以你无论如何都不能依赖它。

相反,只需在要保护的控制器上添加“before_filter:authenticate”(使用会话)。如果有人试图在没有管理员的情况下访问您的管理员控制台,他们将被重定向到登录或任何您喜欢的地方。

答案 2 :(得分:0)

我认为之前的答案(建议控制器中的before_filter更合适)会略微错过OP的用例。将其作为条件路线/高级约束仍然有优势。它不会取代控制器中的前置过滤器以防止未经授权的直接访问。但是,例如,将redirect_to root_path路由直接路由到例如登录时用户的个人资料,或者不登录时的首页,保留闪存消息,否则将在之前过滤器中的第二个重定向中丢失。更优雅的恕我直言,使用高级约束方法(当然,假设在测试自定义约束时会话实际上是可用的)。更不用说,在这种类型的实例中,为什么不保存额外的重定向(因为它涉及整个其他HTTP(S)事务)?

更新: 如果你正在使用Devise,this文章描述了一种更好的方法。我自己实现了它,效果很好,而且很干净。

此外,对于解释投票的评论总是受到赞赏,不仅仅是作者,而是其他读过答案的人,所以他们知道为什么它可能不是一个合理的答案。