rails的过程是先走到routes、然后去对应的controller找相应的action方法、再去model(如果需要的话)、然后去view渲染,最后通过controller返回给浏览器。
从学rails以来,都是先创建一个路由,然后去controller文件中增加相应的action,然后再去views中增加对应的erb。并且跟着资料写test用例做TDD的时候,也是先fix routes中的错误,然后fix controller中的错误,最后再fix views中的错误。
所以导致一直以来的一个认识:
如果要找开/foo/bar这个url,那么在routes.rb中,必须要有get 'foo/bar'
这条路由,在foo_controller.rb中,必须要有bar
这个action,最后在views中,必须要有app/views/foo/bar.html.erb
这个文件。
然而最近才发现:
如果没有bar这个action,只需要有foo_controller.rb这个文件,也是可以正常返回结果的!
具体情况如下:
- 无路由:
No route matches [GET] "/foo/bar"
- 有路由有action无view:
foo#bar is missing a template for this request format and variant.
- 有路由无action无view:
The action 'bar' could not be found for FooController
- 有路由无action有view:正确
想了一下,当有路由无action有view
时也能够返回正确的结果,应该是因为类FooController继承类ApplicatonController,类ApplicationController又继承ActionController::Base,而在ActionController::Base中,对没有action的情况做了处理。因此,即使是没有bar这个action,rails也能正确的找到app/views/foo/bar.html.erb,从而进行渲染并通过controller返回结果给客户端。
这应该是一个常识,但却现在才意识到。好尴尬.jpg
一些要使用layout布局而不需要查询Model数据的页面,是不是就可以不在controller中写对应的action,从而使得controller的内容更加整洁?
网友评论