如何在 Ruby on Rails 中创建一个包罗万象的路由?

Posted

技术标签:

【中文标题】如何在 Ruby on Rails 中创建一个包罗万象的路由?【英文标题】:How to create a catch-all route in Ruby on Rails? 【发布时间】:2013-10-22 12:34:43 【问题描述】:

我想让所有满足特定约束的请求都转到特定的控制器。所以我需要一条包罗万象的路线。我如何在 Rails 中指定它?是这样的吗?

match '*', to: 'subdomain_controller#show', constraints: subdomain: /.+\.users/

这真的会捕获所有可能的路线吗?即使有许多嵌套目录,也不要漏掉,这一点很重要。

使用 Ruby on Rails 3.2,但准备升级到 4.0。

更新'*path' 似乎有效。但是,我遇到的问题是,只要文件存在于我的public 目录中,Rails 就会呈现它。

【问题讨论】:

我认为这个问题在这里得到了回答:[***.com/questions/4132039/… [1]: ***.com/questions/4132039/… @ksu - 所以是*path?然后params[:path] 持有路径? 【参考方案1】:

我认为您需要对这种方法进行微调,但您明白了:

更新:

#RAILS 3
#make this your last route.
match '*unmatched_route', :to => 'application#raise_not_found!'

#RAILS 4, needs a different syntax in the routes.rb. It does not accept Match anymore.
#make this your last route.
get '*unmatched_route', :to => 'application#raise_not_found!'

class ApplicationController < ActionController::Base

...
#called by last route matching unmatched routes.  
#Raises RoutingError which will be rescued from in the same way as other exceptions.
def raise_not_found!
    raise ActionController::RoutingError.new("No route matches #params[:unmatched_route]")
end
...

end

更多信息在这里:https://gist.github.com/Sujimichi/2349565

【讨论】:

这不适用于根路径或存在于public 目录中的路径。根路径没什么大不了的,我可以在我的路由文件中添加一个root to。但另一个问题我不知道如何克服。 在 Rails 4 中它给了我错误:rake aborted!如果未指定 HTTP 方法,则不应在路由器中使用 match 方法。如果您想将您的操作公开给 GET 和 POST,请添加 via: [:get, :post] 选项。如果您想将您的操作公开给 GET,请在路由器中使用 get:而不是:匹配“controller#action”做:获取“controller#action” 是的,我认为 Rails 4 需要在 routes.rb 中使用不同的语法。它不再接受匹配。得到 '*unmatched_route', :to => 'application#raise_not_found!' Rails 4 确实接受匹配,但您还需要指定 HTTP 方法。重定向到根目录的包罗万象是match "*path", to: redirect('/'), via: :all【参考方案2】:

这应该可以工作

Calamas::Application.routes.draw do
  get '*path', to: 'subdomain_controller#show',constraints: lambda  |request| request.path =~ /.+\.users/ 
end

【讨论】:

没有试过这个,但看起来将:subdomain 作为路径可能会令人困惑?那么是路径约束还是子域约束呢? 我之前的回答在你的情况下是行不通的。请参阅我的更新答案。此处的文档-> guides.rubyonrails.org/routing.html#advanced-constraints 这不适用于根路径或存在于public 目录中的路径。根路径没什么大不了的,我可以在我的路由文件中添加一个根。但另一个问题我不知道如何克服。

以上是关于如何在 Ruby on Rails 中创建一个包罗万象的路由?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 ruby​​ on rails 中创建嵌套资源时,“表单中的第一个参数不能包含 nil 或为空”

在 ruby​​ on rails 中创建新表

如何在 ruby​​ on rails 中更改路线?

Ruby On Rails 部分渲染

通过单击 Ruby on Rails 中的按钮生成表单

如何从 Ruby on Rails 中的字符串值创建变量名?