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

时间:2012-01-20 12:27:26

标签: ruby-on-rails

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

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.

4 个答案:

答案 0 :(得分:22)

Avdi Grimm撰写了关于此主题的文章:http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/

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

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

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

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

答案 1 :(得分:7)

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

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

资源:用户,:constraints => {:id => / [^ \ /] + /}

答案 2 :(得分:3)

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)。您应该升级您的应用程序。

答案 3 :(得分:0)

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