如何在URL Rails中编码(。)Dot

我有以下路线删除/列出用户。

map.connect 'developer/:user_name/delete',:controller=>"developers",:action=>"delete",:method=>:delete map.connect 'developer/:user_name/list',:controller=>"developers",:action=>"list",:method=>:get 

在通过使用%2E编码Dot来列出用户时,我可以看到成功响应

 http://localhost:3000/developer/testuser%2Ehu/list 

但在尝试删除包含Dot(。)的用户时,会抛出404错误。

 http://localhost:3000/developer/testuser%2Ehu/delete, how to fix this issue. 

Rails路由中默认不允许使用该点,因为该点被视为页面的扩展名。 您应该避免在URL中使用点。

但是,在您的情况下,您可以指示Rails考虑传递正则表达式的:user_name参数的点。

 map.connect 'developer/:user_name/list', :controller => "developers", :action => "list", :method=> :get, :user_name => /[\w.]+/ 

PS。 由于map.connect ,您使用的是非常旧版本的Rails(Rails <3)。 您应该升级您的应用程序。

Avdi Grimm撰写了这个主题: http ://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go -a-小位疯狂的/

你会想做这样的事情(完全归功于avdi)

  resources :users, :constraints => { :id => /.*/ } do resources :projects end 

post上的评论者说你也可以这样做:

 resources :users, :id => /.*/ 

我刚遇到类似的问题,我的搜索页面url是/ search / search_term。 当search_term有一个点时,Rails会将其解释为请求格式。 如果我试图搜索book.html,它实际上搜索了书,因为Rails将html解释为格式。 无法识别的格式将返回错误。

在我的情况下,Avdi Grimm的第一个解决方案不起作用,因为我的搜索是分页的,页面编号也在URL中(/ search / book / 2)。 对我来说,解决方案是接受所有东西,但是对于search_term(Avdi Grimm的post中的最后一个解决方案)是一个斜线:

resources:users,:constraints => {:id => / [^ \ /] + /}

您是否正在对删除url执行DELETE请求? 请注意,路由定义为:method=>:delete ,因此它需要DELETE请求(不是GET)。