美文网首页
应该是一个被自己一直忽略的常识

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

作者: kamionayuki | 来源:发表于2016-11-20 02:03 被阅读103次

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

    相关文章

      网友评论

          本文标题:应该是一个被自己一直忽略的常识

          本文链接:https://www.haomeiwen.com/subject/uywepttx.html