【发布时间】:2010-07-17 23:51:18
【问题描述】:
我想知道任意路径是否可以映射到路由
recognized_request_for 完成了我想要的,但我无法让它在我的控制器中工作。
具体来说,如何执行recognized_request_for 或从我的控制器完成相同任务的操作?
【问题讨论】:
标签: ruby-on-rails routing
我想知道任意路径是否可以映射到路由
recognized_request_for 完成了我想要的,但我无法让它在我的控制器中工作。
具体来说,如何执行recognized_request_for 或从我的控制器完成相同任务的操作?
【问题讨论】:
标签: ruby-on-rails routing
对于 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
【讨论】:
解决方案:
@related_page_path = '/' + @page.path
begin
ActionController::Routing::Routes.recognize_path(@related_page_path, :method => :get)
rescue
@related_page_path = nil
end
【讨论】:
如果你想连接任意路径的控制器和动作,你可以使用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 哈希的一部分。
【讨论】:
您可以动态生成路由辅助方法并查看它是否存在(使用 respond_to? 甚至只是捕获任何抛出的异常)。
【讨论】:
self.respond_to?(:action_name)。您可以通过助手使用controller.respond_to?(:action_name)。当然你也可以通过Rails.application.routes.url_helpers.respond_to?(:the_path_you_want_to_check)查看铁路线路
我最近遇到了一个问题,在给定一组可能路径的情况下,我必须检查路径是否存在。我已经尝试过上述建议Rails.application.routes.recognize_path,但从rails 4.2.1 开始,它已被废弃。我改为使用以下内容:
Rails.application.routes.named_routes.routes.any?{ |key, value| key.to_s === "new_article" }
【讨论】: