【问题标题】:Check to see whether a route exist or not in Rails 3检查 Rails 3 中是否存在路由
【发布时间】:2012-08-24 19:41:15
【问题描述】:

我们可以检查/测试 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.application.routes.recognize_path

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 routing


    【解决方案1】:

    这个呢:

    <% link_to @post.title, post_path if post_path %>
    

    【讨论】:

    • 这可以工作,但是我当前的“menu.controller”和“menu.action”类型是字符串。您认为将这些字符串解析为“something_path”对我来说更好,还是 Rails 中有更好的函数将这些字符串作为参数来检查路由是否存在?
    • 做一个命名路由会容易得多,比如我是怎么做的。如果您可以创建一个命名路由并检查它是否存在,那么您应该很好,并且您不必写出控制器和操作所有内容,因此命名为路由。
    • 好的,最后我使用“url”列来存储菜单,而不是“控制器”和“动作”列。但我仍然认为 Rails 应该提供一个功能来通过提供控制器和操作名称来检查路由是否存在。
    • 我可以理解你的想法,但 99% 的 Rails 程序员使用命名路由或通过resources 获取它们。善于创新!
    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 这个黑客救了我:)
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2019-12-09
    • 2016-07-08
    • 2017-10-02
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多