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

log*_*han 12 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
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:3000/developer/testuser%2Ehu/list
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:3000/developer/testuser%2Ehu/delete, how to fix this issue.
Run Code Online (Sandbox Code Playgroud)

Jes*_*ott 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-小位疯狂的/

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

  resources :users, :constraints => { :id => /.*/ } do
    resources :projects
  end
Run Code Online (Sandbox Code Playgroud)

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

resources :users, :id => /.*/
Run Code Online (Sandbox Code Playgroud)

  • 如果您在网址中有另一个/,则无法解释,例如`/ search/hello + world/page/20`.可能会更好地使用除了//[^ /] + /`之外的所有东西 (2认同)

Gui*_*ier 7

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

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

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


Sim*_*tti 3

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

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

map.connect 'developer/:user_name/list', :controller => "developers", :action => "list", :method=> :get, :user_name => /[\w.]+/
Run Code Online (Sandbox Code Playgroud)

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