我正在编写我的第一个插件,在该插件中,我需要为某些控制器/操作对运行一个方法。对于这个插件,配置yml看起来像这样 -
track1:
start_action: "home", "index"
end_action: "user", "create"
所以,在我的插件中,我将首先阅读上面的yml文件。之后我想运行一个动作说 - first_function as before_filter到home-controller index-action,我将运行second_function作为after_filter进行用户控制器create-action。
但是我无法弄清楚如何为此编写过滤器,这些过滤器将在插件中声明,并将运行用户在上述yml文件中指定的操作。
请帮忙!
答案 0 :(得分:0)
我认为有两种选择可以实现目标。
第一种方法:声明ApplicationController
内和过滤器内的过滤器,检查{yaml-configuration中的controller_name
和action_name
是否匹配。如果匹配,则执行它,如果不是忽略。
在想要
的代码中class ApplicationController
before_filter :start_action_with_check
after_filter :end_action_with_check
def start_action_with_check
c_name, a_name = CONFIG['track1']['start_action'].split(', ')
if c_name == controller_name && a_name == action_name
do_start_action
end
end
...
我希望你明白这一点。
第二种方法:定义before_filter
的一种简洁方法是在模块中定义它们。通常,您会使用self.included
方法来定义before_filter
,但当然,您可以有条件地定义它们。例如:
class HomeController < ApplicationController
include StartOrEndAction
...
end
并在lib/start_or_end_action.rb
中写下
module StartOrEndAction
def self.included(base)
# e.g. for the start-action
c_name, a_name CONFIG['track1']['start_action'].split(', ')
if c_name == controller_name && a_name == action_name
base.before_filter :do_start_action
end
# and do the same for the after_filter
end
def do_start_action
...
end
def do_end_action
...
end
end
第二种解决方案的优点是before_filter
和after_filter
仅在需要时定义。缺点是您必须将模块包含在每个控制器中,您可以在其中配置前置过滤器。
第一个优点是任何控制器都被覆盖,并且在检查前后过滤器时会有一点开销。
希望这有帮助。