我有以下路线删除/列出用户。
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.
答案 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)。