动态创建方法? _one_time_conditions_valid_718?

时间:2014-10-28 17:47:45

标签: ruby-on-rails ruby validation

我是RoR的新手并且正在进入一个大型的RoR项目。我使用railroady来创建所有模型和控制器的图表。我注意到许多控制器以

形式的多达五种方法开头
_one_time_conditions_valid_XXX?

其中XXX的范围是200到1116.但是,这些方法不会出现在实际代码中。这些方法是否由某些gem自动生成?我无法在任何地方找到对此的引用。

1 个答案:

答案 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

然后,它会用于通过称为beforeafter的两种不同方法向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_filterafter_filterbefore_actionaround_action等等(可用的回调列表很漂亮)长)