DocumentsController#common_query可以处理多个不同的请求样式。

即。在批次4的所有文档或所有文档加标签“高兴”

我想一个途径让时间相当,所以:

/文档/ common_query?批次= 4

/文档/ common_query?标签=快乐

成为:

/文档/批次/ 4

/文档/标签/快乐

因此,最终的结果是#common_query称为但URL的一部分被用作PARAM NAME和一部分它的值。

有帮助吗?

解决方案

作为一个单一路线:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

然后params[:type]要么被"batch""tag",和params[:id]要么"4""happy"。你将不得不确保为DocumentsController其他动作的路线在此之前来,因为这将匹配看起来像"documents/*/*"任何URL。

但是为什么它必须是一个单一的路线?你可以使用两条路线是这样的:

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

这将有同样的效果,但更具体的,所以你就不必担心路由的优先级顺序。

其他提示

在第二个选项,有两条路线,几乎可以肯定是更好的方式去,因为它只会匹配种要支持的URL,而第一个选项也将“匹配”像/文件/富网址/条,这很可能会造成#common_query方法,充其量,返回RecordNotFound(404)的响应。在最坏的情况,如果你还没有准备好不会看到任何预期则params的,你会得到一个500错误,而不是...

当然,如果启动有很多变型,你结束了很多路线。如果你需要在组合使用它们,例如,/文档/批号/ 4 /标签/快乐,那么你就需要使用通配符路线,并在你的控制器做参数处理。这可能看起来像:

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"

的URL的各种元件将是可利用的控制器作为PARAMS [:规格]。你可能把它转换成一个发现,像这样:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

这哈希[]技术方案为键 - 值散列)的一个维阵列,即使你不能直接馈送到一个查找(这可能是有用的转换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top