Rails路由与/结尾

时间:2011-08-06 21:46:00

标签: ruby-on-rails ruby ruby-on-rails-3

是否可以将一个资源(至少只显示,索引)的路由更改为/到最后?

例如:

test.heroku.com/books/1/ #the last / will produce an error

使用Rails 3.0.9。服务器heroku.com

routes.rb中:

resources :books

错误:

2011-08-06T21:41:35+00:00 app[web.1]: Started POST "/books/1/?ref=bookmarks" for        213.229.110.100 at 2011-08-06 14:41:35 -0700
2011-08-06T21:41:35+00:00 app[web.1]: 
2011-08-06T21:41:35+00:00 app[web.1]: ActionController::RoutingError (No route matches "/books/1"):

但是当我将浏览器指向

http://test.heroku.com/books/1 

正在运作

http://test.heroku.com/books/1/

也在努力。

但如果我使用:

http://test.heroku.com/books/1/

作为Facebook应用程序的画布网址无效。

由于

编辑完成错误日志:

2011-08-06T22:07:53+00:00 heroku[web.1]: State changed from starting to up
2011-08-06T22:08:13+00:00 app[web.1]: 
2011-08-06T22:08:13+00:00 app[web.1]: 
2011-08-06T22:08:13+00:00 app[web.1]: Started POST "/books/1/?ref=bookmarks" for  213.229.110.100 at 2011-08-06 15:08:13 -0700
2011-08-06T22:08:13+00:00 app[web.1]: 
2011-08-06T22:08:13+00:00 app[web.1]: ActionController::RoutingError (No route matches "/books/1"):
2011-08-06T22:08:13+00:00 app[web.1]:   
2011-08-06T22:08:13+00:00 app[web.1]: 
2011-08-06T22:08:13+00:00 app[web.1]: 
2011-08-06T22:08:13+00:00 heroku[router]: POST test.heroku.com/books/1/ dyno=web.1 queue=0 wait=0ms service=136ms status=404 bytes=728
2011-08-06T22:08:13+00:00 heroku[nginx]: POST /books/1/?ref=bookmarks HTTP/1.1 | 213.229.110.100 | 904 | http | 404

1 个答案:

答案 0 :(得分:2)

如果您正在使用内置的资源路由,那么不会产生错误:

resources :books

如果您已经定义了自定义路由(可能在将2.3应用程序升级到Rails 3的过程中)而没有考虑尾部斜杠,那么您可能不会那么幸运。如果是这种情况并且您不确定如何调整,则应编辑问题并添加路由文件的相关部分(config / routes.rb)。


更新

好的,所以看完你发布的日志输出后,我看到发生了什么。 Facebook正在请求/books/1/?ref=bookmarks。这与/books/1/不同,Rails将其解释为实际上是对/books/1资源的请求。在这种情况下,为什么还要使用尾随斜杠呢?从规范来讲,它是不准确的,显然它会导致问题。

更新2

您可以添加POST /books/1作为路由到资源丰富的路线,如下所示:

resources :books do 
  post '/' => :show, :on => :member
end