论坛首页 编程语言技术论坛

Share methods in Controller and Helper (Rails)

浏览 4818 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-06  
Share methods in Controller and Helper (Rails)

在Ruby on Rails里面,首先应该明确的一点 —– Helper是view的helper,根据这个原则,在默认实现下,controller是不允许访问helper里面的方法的。当然helper在本质上是一个module,所以要在controller和helper之间共享一些方法的办法还是很多的。因为是双方都拥有的方法,所以就面临一个问题 —— 方法放在那里比较合理?controller还是helper?我阐述一下我的原则:

如果方法中需要引入其他helper方法,那么我们建议该方法放在helper中;否则,可以放在controller中或者写一个公共module。放在controller里面需要注意安全性,因为controller里面public的方法很有可能通过URL加以执行,所以我们建议所有的helper 方法都用private 加以约束。

下面我就详细说一下4中方法。

Helper方法放在controller中,通过ApplicationHelper来实现公用。代码存在一定的安全隐患。
module ApplicationHelper
  def method_missing(method, *args, &block)
    if ApplicationController.instance_methods.include? method.to_s
      controller.send(method, *args, &block)
    else
      super
    end
  end
end

Helper方法放在controller中,通过helper_method来实现公用。代码安全。
private

heper_method :login?
def login?
  # your logic goes here
end

Helper方法放在Helper中,通过include module_name向controller暴露,代码安全
include FullModuleName

Helper方法放在一个独立的module中,helper和controller通过include这个module来获得公共方法。
include CommonModuleName

关于include module需要注意的是,它不会帮助你去自动解决module依赖性的问题。
   发表时间:2008-04-16  
在RoR2.0的class ApplicationController里有一句
  helper :all # include all helpers, all the time
按理说就可以从各个controller里面使用helper里的方法了。
可是我的实践却不成功
不在controller里面明确地include自己想要的helper module就不成,不明所以!

另外,view里可以使用helper里的方法,是在怎么做到的呢?rails在哪里做了什么工作呢?
0 请登录后投票
   发表时间:2008-04-16  
helper是为template准备的,在controller中调用helper的方法本来就是不对的
公用方法应该很少才对,因为helper是为页面而准备的,基本上都是一些输出函数,而controller里是不应该出现这些函数的
正确的方法应该是将这些方法写到对应的model里,如果无法归类到某一个model,还可以将其写到lib里面(注意文件名),甚至是config/initializers内(需要重启rails才能生效)
0 请登录后投票
   发表时间:2008-04-16  
原则上,helper产生的返回值都是
<div>....</div>
这样的HTML字符串。

一般用来进行view的页面元素拼接工作。

不宜放入其他逻辑。更不宜放入其他逻辑后被controller调用。

否则的话就要检讨一下代码是否良构了。
0 请登录后投票
   发表时间:2008-04-16  
这个,我就尽量不用,或者找模型来代理,尽量让controller变得简单,至少model比较容易写测试,而测试controller我不喜欢。。。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics