[url=http://jack.lifegoo.com/?p=158][b]Share methods in Controller and Helper (Rails)[/b][/url]
在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依赖性的问题。