【问题标题】:Determine if path exists as route in Rails controller确定路径是否作为 Rails 控制器中的路由存在
【发布时间】:2010-07-17 23:51:18
【问题描述】:

我想知道任意路径是否可以映射到路由

recognized_request_for 完成了我想要的,但我无法让它在我的控制器中工作。

具体来说,如何执行recognized_request_for 或从我的控制器完成相同任务的操作?

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    对于 Rails 3,调用是

    Rails.application.routes.recognize_path
    

    代替

    ActionController::Routing::Routes.recognize_path
    

    示例:

    def path_exists?(path)
      Rails.application.routes.recognize_path(path)
      true
    rescue ActionController::RoutingError
      false
    end
    

    【讨论】:

    • 你不应该只是拯救所有的例外。
    • @PRWhitehead 不只是投反对票和负面评论,不如建议拯救哪个异常?
    • 你可以从 ActionController::RoutingError 中拯救
    • 不幸的是,这不适用于路由文件中的重定向。
    • 小澄清,上面使用的救援是对 StandardError 而不是异常的隐式救援,并不是您可以犯下的最严重的红宝石犯罪。它没有任何意义,但不会拦截 CTRL-C 等。
    【解决方案2】:

    解决方案:

    @related_page_path = '/' + @page.path
    begin
      ActionController::Routing::Routes.recognize_path(@related_page_path, :method => :get)
    rescue
      @related_page_path = nil
    end
    

    【讨论】:

      【解决方案3】:

      如果你想连接任意路径的控制器和动作,你可以使用map.connect

      map.connect '/any/random/string/of/stuff', :controller => 'items', :action => 'new'
      

      您甚至可以在路径中调用嵌入的参数指定:

      map.connect '/seeking/room/for/[:number_of_nights]/nights', :controller => 'rooms', :action => 'index'
      

      使用上述内容,您将收到 url 中表示的值,作为控制器中 params 哈希的一部分。

      【讨论】:

        【解决方案4】:

        您可以动态生成路由辅助方法并查看它是否存在(使用 respond_to? 甚至只是捕获任何抛出的异常)。

        【讨论】:

        • 是的,我真的不知道那是什么意思 :)
        • @Cristopher 说您正在从可以使用的控制器内部进行检查:self.respond_to?(:action_name)。您可以通过助手使用controller.respond_to?(:action_name)。当然你也可以通过Rails.application.routes.url_helpers.respond_to?(:the_path_you_want_to_check)查看铁路线路
        【解决方案5】:

        我最近遇到了一个问题,在给定一组可能路径的情况下,我必须检查路径是否存在。我已经尝试过上述建议Rails.application.routes.recognize_path,但从rails 4.2.1 开始,它已被废弃。我改为使用以下内容:

        Rails.application.routes.named_routes.routes.any?{ |key, value| key.to_s === "new_article" }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-12
          • 2016-04-11
          • 2012-04-14
          • 2011-12-11
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多