【问题标题】:How do I ignore a specific path?如何忽略特定路径?
【发布时间】:2013-03-21 10:49:29
【问题描述】:

routes.rb 的最后一行是这样的:

resources :tags, path: "", except: [:index, :new, :create], constraints: { :id => /.*/ }

它基本上处理所有 /tagnames。

问题是我正在尝试使用 livereload,rack middleware version 发生的事情是它正在向 /livereload 发送 ping。

但是,上面的路由拦截了它并将它发送到我的TagsController....所以我的日志文件看起来像这样:

Started GET "/livereload" for 192.168.1.1 at 2013-03-30 19:49:13 -0500
Processing by TagsController#show as HTML
  Parameters: {"id"=>"livereload"}
  Tag Load (3.3ms)  SELECT "tags".* FROM "tags" WHERE "tags"."name" = 'livereload' LIMIT 1
  Tag Load (2.0ms)  SELECT "tags".* FROM "tags" WHERE "tags"."id" = $1 LIMIT 1  [["id", "livereload"]]
Completed 404 Not Found in 9ms

ActiveRecord::RecordNotFound (Couldn't find Tag with id=livereload):
  app/controllers/tags_controller.rb:16:in `show'

那么我该如何告诉该路由忽略所有 /livereload 请求,或者我该如何以另一种方式处理呢?

【问题讨论】:

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


    【解决方案1】:

    您可以在路由上使用自定义约束来告诉忽略任何特殊路由,因为它是一个简单的规则,您可以内联执行,您可以检查 req.env["PATH_INFO"]或者你也可以检查 req.params[:id]

    示例 1:

    resources :tags, path: "", except: [:index, :new, :create], constraints: lambda{ |req| req.env['PATH_INFO'] != '/livereload' && req.params[:id] =~ /.*/ }
    

    示例 2:

    resources :tags, path: "", except: [:index, :new, :create], constraints: lambda{ |req| req.params[:id] != '/livereload' && req.params[:id] =~ /.*/ }
    

    【讨论】:

    • 顺便说一句....这两个都不起作用。我仍然收到ActionController::RoutingError (No route matches [GET] "/livereload"):
    • 这是一个不同的问题。关于约束,想法是一样的,您可以使用约束来确保路由不会捕获 livereload,对于您编写的内容,它工作正常,您可以尝试使用 !req.params[:id]。包括?('livereload')。现在你得到“ActionController::RoutingError”,因为没有匹配“/livereload”的路由,检查你的livereload配置,由于某种原因,中间件的路由没有生成。
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2011-05-16
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多