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依赖性的问题。
在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依赖性的问题。
评论
lgn21st
2008-04-16
这个,我就尽量不用,或者找模型来代理,尽量让controller变得简单,至少model比较容易写测试,而测试controller我不喜欢。。。
7thbyte
2008-04-16
原则上,helper产生的返回值都是
<div>....</div>
这样的HTML字符串。
一般用来进行view的页面元素拼接工作。
不宜放入其他逻辑。更不宜放入其他逻辑后被controller调用。
否则的话就要检讨一下代码是否良构了。
<div>....</div>
这样的HTML字符串。
一般用来进行view的页面元素拼接工作。
不宜放入其他逻辑。更不宜放入其他逻辑后被controller调用。
否则的话就要检讨一下代码是否良构了。
zeroleonhart
2008-04-16
helper是为template准备的,在controller中调用helper的方法本来就是不对的
公用方法应该很少才对,因为helper是为页面而准备的,基本上都是一些输出函数,而controller里是不应该出现这些函数的
正确的方法应该是将这些方法写到对应的model里,如果无法归类到某一个model,还可以将其写到lib里面(注意文件名),甚至是config/initializers内(需要重启rails才能生效)
公用方法应该很少才对,因为helper是为页面而准备的,基本上都是一些输出函数,而controller里是不应该出现这些函数的
正确的方法应该是将这些方法写到对应的model里,如果无法归类到某一个model,还可以将其写到lib里面(注意文件名),甚至是config/initializers内(需要重启rails才能生效)
baryon
2008-04-16
在RoR2.0的class ApplicationController里有一句
helper :all # include all helpers, all the time
按理说就可以从各个controller里面使用helper里的方法了。
可是我的实践却不成功
不在controller里面明确地include自己想要的helper module就不成,不明所以!
另外,view里可以使用helper里的方法,是在怎么做到的呢?rails在哪里做了什么工作呢?
helper :all # include all helpers, all the time
按理说就可以从各个controller里面使用helper里的方法了。
可是我的实践却不成功
不在controller里面明确地include自己想要的helper module就不成,不明所以!
另外,view里可以使用helper里的方法,是在怎么做到的呢?rails在哪里做了什么工作呢?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 19530 次
- 性别:

- 来自: Mars

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Share methods in Control ...
这个,我就尽量不用,或者找模型来代理,尽量让controller变得简单,至少m ...
-- by lgn21st -
Share methods in Control ...
原则上,helper产生的返回值都是<div>....</div>这 ...
-- by 7thbyte -
Share methods in Control ...
helper是为template准备的,在controller中调用helper ...
-- by zeroleonhart -
Share methods in Control ...
在RoR2.0的class ApplicationController里有一句 ...
-- by baryon -
RXML
xu_wccq 写道发现个好方法先把xml转人为Hash表(from_xml(p ...
-- by xu_wccq






评论排行榜