我是RoR的新手并且正在进入一个大型的RoR项目。我使用railroady来创建所有模型和控制器的图表。我注意到许多控制器以
形式的多达五种方法开头_one_time_conditions_valid_XXX?
其中XXX的范围是200到1116.但是,这些方法不会出现在实际代码中。这些方法是否由某些gem自动生成?我无法在任何地方找到对此的引用。
答案 0 :(得分:2)
好的,这是你的Reference。这些方法在名为ActiveSupport::Callbacks::Callback
第159行的方法#_compile_per_key_options
中定义。看起来像这样
def _compile_per_key_options
key_options = _compile_options(@per_key)
@klass.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
def _one_time_conditions_valid_#{@callback_id}?
true if #{key_options}
end
RUBY_EVAL
end
然后,它会用于通过称为before
和after
的两种不同方法向around
,#start
和#end
过滤器提供数据。
#start
和#end
都会检查这些方法
return if key && !object.send("_one_time_conditions_valid_#{@callback_id}?")
从它看起来这些方法的全部目的只是确定是否已经定义了一个回调,然后是否编译了相应的钩子。
这些钩子的名字和它们的名字一样清晰。 before
挂钩在定义的操作之前运行并在操作获取之前访问数据,after
挂钩在定义的操作之后运行并在操作获取后访问数据,并且around
挂钩换行一个动作并触发他们yield
的事件。您甚至可以定义自己的:
class Record
include ActiveSupport::Callbacks
define_callbacks :magic
def magic
run_callbacks :magic do
puts "Abracadabra"
end
end
end
class Magician < Record
set_callback :magic, :before, :perform
def perform
puts "The Magician will now perform a Trick"
end
set_callback :magic, :after do |object|
puts "Tada"
end
end
清楚地显示了这一点
magician = Magician.new
magician.magic
#Output:
# The Magician will now perform a Trick #(before callback)
# Abracadabra #(actual event)
# Tada #(after callback)
这意味着如果你的控制器有多达五个&#34;其中有相同数量的过滤器,例如before_filter
,after_filter
,before_action
,around_action
等等(可用的回调列表很漂亮)长)