应该是一个被自己一直忽略的常识

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的内容更加整洁?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容