簡體   English   中英

動態創建的方法? _one_time_conditions_valid_718?

[英]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種不同方法向過濾器的beforeafteraround提供數據。

#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_filterafter_filterbefore_actionaround_action等(可用回調的列表很長)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM