`
sean
  • 浏览: 15917 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

澄清对helper的一些错误认识

阅读更多
helper主要是帮助视图尽可能将代码从视图中隔离出来, 并提高视图之间代码的可重用性. 基于此, rails为我们做了一些"连接"工作:
  1. 每一个controller都对应一个helper module,例如对应UserController的是UserHelper, rails内部做了一些连接工作,使得默认每个controller下的所有视图都可以访问相应helper 的方法.
  2. rails内置一个全局helper:ApplicationHelper, rails内部做了一些连接工作,使得默认“所有controller”下的视图都可以访问ApplicationHelper下 的方法.
上面两条有时容易让人产生迷惑:
  1. 对于上面的第一条, 是不是每个controller本身也可以默认访问相应helper 的方法? 答案是不可以. 因为上面提到的helper是针对“视图”(而不是controller)提高代码隔离和重用的帮手, 所以默认只有视图才能访问到相应的helper的方法. 但是如果你有充分的理由要在controller中访问helper的方法, 你可以自己做:
    ruby 代码
     
    1. class UserController < ApplicationController  
    2.    include UserHelper  
    3. end  

  2. 同理, 对于上面的第二条, 是不是所有controller也可以默认访问ApplicationHelper 的所有方法?答案同样是不可以,原因同上.如果一定要这么做,因为所有的controller都继承ApplicationController, 所以可以这样:
    ruby 代码
     
    1. class ApplicationController < ActionController::Base  
    2.   include ApplicationHelper  
    3. end  

有时我们可能想将某个controller的helper下的一些方法共享给其他controller,比如想将UserHelper下的一些方法共享给PhotoController下的所有视图, 其中一种方案是将UserHelper下的方法放到ApplicationHelper中, 这样所有的controller下的视图都能访问到这些方法.另外两种方案如下:
  1. PhotoController include UserHelper:
    ruby 代码
    1. class PhotoController < ApplicationController  
    2.    include UserHelper  
    3. end  
  2. 使用helper方法
    ruby 代码
     
    1. class PhotoController < ApplicationController  
    2.   helper :user  
    3. end  

这里容易使人产生迷惑的是这两种方法有什么不同:第一中方案会使PhotoController 和 其下的所有视图都能访问UserHelper的方法;而第二种方案仅会使PhotoController的所有视图能访问UserHelper的方法, 而PhotoController本身则不能。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics