[英]Dynamically created method? _one_time_conditions_valid_718?
我是RoR的新手,正在跳入大型RoR項目。 我使用Railroady創建了所有模型和控制器的圖表。 我注意到,許多控制器以以下形式開始多達五種方法
_one_time_conditions_valid_XXX?
其中XXX的范圍是200到1116。但是,這些方法不會出現在實際代碼中。 這些方法是否由某些寶石自動生成? 我在任何地方都找不到對此的參考。
好的,這是您的參考 。 這些方法在ActiveSupport::Callbacks::Callback
#_compile_per_key_options
第159行方法中定義。
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
然后,它用於通過稱為#start
和#end
2種不同方法向過濾器的before
, after
和around
提供數據。
#start
和#end
檢查這些方法,如下所示
return if key && !object.send("_one_time_conditions_valid_#{@callback_id}?")
從表面上看,這些方法的全部目的只是確定是否已定義了回調,然后是否編譯了適當的鈎子。
這些鈎子和它們的名字一樣清晰。 掛鈎在定義的動作before
運行並在動作獲取之前訪問數據,掛鈎在定義的動作after
運行並在動作獲取之后訪問數據之后,並且around
掛鈎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)
這意味着,如果您的控制器中有“多達五個”,則表示過濾器的數量相等,例如before_filter
, after_filter
, before_action
, around_action
等(可用回調的列表很長)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.