在Rails 3中检查路由是否存在

4

我们能够在Rails中检查/测试路由是否存在吗?

例如,我想显示一个导航栏,应该显示所有菜单URL,无论URL是否存在。(为了区分两者,损坏的URL将使用不同的样式)。

显示每个菜单的代码如下:

%li= link_to_unless_current menu.name, :controller => menu.controller, :action => menu.action

然而,如果提供的控制器和操作路由不存在,Rails 将会抱怨并抛出异常。

Rails 是否有一个函数在我执行上述代码之前进行检查?也许像这样:

-if some_function_to_check_route_existence?(:controller => menu.controller, :action => menu.action)

编辑:

与其在菜单中使用“控制器”和“操作”列,我使用了一个“url”列。现在,我可以像这样做:

- if Menu.root
      - for menu in Menu.root.self_and_descendants
        - if menu.url
          %li= link_to_unless_current menu.name, menu.url
        - else
          %li= menu.name
我可以使用Rails函数来确定路由是否存在,例如:

我也可以使用Rails函数来确定路由是否存在,例如:

Rails.application.routes.recognize_path
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
这个怎么样?
<% link_to @post.title, post_path if post_path %>

这可能可行,但是我的当前的 "menu.controller" 和 "menu.action" 类型是字符串。你认为将这些字符串解析成 "something_path" 更好,还是Rails中有更好的函数可以将这些字符串作为参数以检查路由是否存在? - giosakti
制作命名路由会更容易,就像我所做的那样。如果你能够创建一个命名路由并检查其是否存在,那么你就可以轻松完成任务,而不必编写控制器和操作等所有内容,这就是命名路由的好处。 - thenengah
最终,我使用了一个“url”列来存储菜单,而不是“控制器”和“操作”列。但我仍然认为Rails应该提供一种通过提供控制器和操作名称来检查路由是否存在的函数。 - giosakti
我能理解你的想法,但99%的Rails程序员使用命名路由或通过“资源”获取它们。在创新方面做得很好! - thenengah

0

你可以使用 begin rescue 代替检查存在性

route_exist = true
begin
    url_for(:controller => menu.controller, :action => menu.action)
rescue
    # route not exist
    route_exist = false
end

if route_exist
   ...
else
   ...
end

这个 Hack 救了我 :) - Vishwas Nahar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,