Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将多个操作路由到同一控制器和操作_Ruby On Rails_Ruby On Rails 3_Routing_Routes_Match - Fatal编程技术网

Ruby on rails 将多个操作路由到同一控制器和操作

Ruby on rails 将多个操作路由到同一控制器和操作,ruby-on-rails,ruby-on-rails-3,routing,routes,match,Ruby On Rails,Ruby On Rails 3,Routing,Routes,Match,我正在尝试在我的Rails应用程序上实现类似的功能: match '/:language', :to => 'posts#search_result' match '/:tag', :to => 'posts#search_result' match '/:language/:tag', :to => 'posts#search_result' 我使用这个搜索结果操作根据语言和标签过滤一些帖子 问题是有时:标记将为零或:语言将为零;因此,我在采取行动时有以下3种可能性: &l

我正在尝试在我的Rails应用程序上实现类似的功能:

match '/:language', :to => 'posts#search_result'
match '/:tag', :to => 'posts#search_result'
match '/:language/:tag', :to => 'posts#search_result'
我使用这个搜索结果操作根据语言和标签过滤一些帖子

问题是有时:标记将为零或:语言将为零;因此,我在采取行动时有以下3种可能性:

<%=link_to "Spanish", {:controller => 'posts', :action => 'search_result', :language => "spanish"} %>

<%= link_to "Spanish", {:controller => 'posts', :action => 'search_result', :language => "spanish", :tag => @tag} %>

<%=link_to "#{tag.name}", {:controller => 'posts', :action => 'search_result', :tag => @tag} %>
但是现在我得到了第一个和第三个案例的正确答案,但是第二个案例我得到了: /spanish?tag=rails 或者再次/西班牙语(取决于我是先选择了标记还是先选择了语言)


我希望我的解释是正确的。有什么想法吗??。谢谢

不要单独定义/:language和/:language/:tag,而是将它们一起定义,并将/:tag作为可选的URI元素

match '/:language(/:tag)', :to => 'posts#search_result'

我相信路由是按照定义路由的顺序匹配的(以及从中生成的URI)。您在定义/:lang/:tag之前定义了/:lang,因此它匹配了/:lang并使:tag成为GET参数。我想您可以优化定义的顺序,但我相信使用上述语法是首选方法。

路由器无法区分:语言和:标记之间的区别

因为在视图中构建代码时,路由会显示“语言”和“标记”。。请记住,在html中,这已被转换为纯ole URL,例如/spanish或/rails

然后必须从这个URL中找出路由

正如我所说的,路由器无法分辨特定的单词是一种语言还是一个标签。。。普通的ole URL中不再有“标记”或“语言”这个词。。。所以你的两条路线是:

match '/:language', :to => 'posts#search_result'
match '/:tag', :to => 'posts#search_result'
两者都是相同类型的URL

斜杠后只有一个标记。以下是一些与该路线匹配的示例:

/greek
/spanish
/rails
/urdu
/whatever
它们都将匹配“斜杠后的单个令牌”上匹配的第一条路由。。。这意味着您的路由器将把所有这些匹配到“语言”路由,并且永远不会匹配“/:tag”路由,因为它已经在上面的路由上匹配

呵呵:对路由器来说都是希腊语;)

编辑:


嗨,这对我理解路由是如何工作的帮助很大。。但我还是看不清楚。我理解你说的,所以基本上我理解我应该做一些类似于匹配'/tags/:tag的事情,至少只路由到帖子#搜索结果以/tag开头的URL。。解决方案是什么

是的,“/tags/:tag”将是清晰明确的,但是如果您希望它在标记与语言方面真正灵活,您最好使用以下简单的:

match '/posts/search', :to => 'posts#search_result'
它可以使用上面示例的任何链接生成例如:

/posts/search?tag=rails
/posts/search?language=spanish
/posts/search?language=spanish&tag=rails
这也更清楚地说明了通过的内容和原因

第三个URL的描述是“我正在搜索一组包含language=spanish和tag=rails的帖子”


您的URL应该反映资源(在本例中是一组帖子),其他所有内容最好作为查询参数来完成。

使用
match'/:language(/:tag);:to=>“posts#search_result”
我第一次选择标签时遇到问题。但这是两行代码:
match'/:language(/:tag);:to=>“posts#search_result”
match'/:tag(/:language);:to=>“posts#search_result”
我涵盖了所有案例,工作得很好。没有你的帮助是找不到的。谢谢`嗨,这对我理解路由是如何工作的帮助很大。。但我还是看不清楚。我理解你所说的,所以基本上我理解我应该做一些像
match'/tags/:tag
这样的事情,至少只路由到帖子#搜索结果以/tag开头的URL。。解决方案是什么??如果路由器在:language和:tag之间没有区别,为什么这两行给出了不同的行为?:
match'/:language(/:tag);:to=>“posts#search_result”
match'/:tag(/:language);:to=>“posts#search_result”
已经添加到我的答案中,以反映更好的解决方案。我不知道为什么后两种行为不同-但最后,这不重要-它们不是您需要的路由的最佳/最具解释性的选择。您能告诉我两个新示例的不同行为是什么吗?当然:使用
match'/:language(/:tag)
我遇到了这样一个错误:
没有路由匹配{:controller=>“posts”;:action=>“search_result”;:tag=>“Poems”}
;使用
match'/:tag(/:language);:to=>“posts#search_result”
我在代码的另一部分遇到一个错误,告诉我:
没有路由匹配{:controller=>“posts”;:action=>“search#result”;:language=>“espanhol”
您可以看到,在第一种情况下,我使用:tag参数进行链接,它不喜欢/:语言;在第二种情况下,我使用:language参数进行链接,它不喜欢/:标记。嘿,现在一切都很好,您的解决方案工作得很好。我之前评论的内容是o中的一个错误我的一个链接!…现在全部清除:)非常感谢!。
/posts/search?tag=rails
/posts/search?language=spanish
/posts/search?language=spanish&tag=rails