2009-11-13 35 views
0

這部分是什麼。 。 。試圖瞭解Base.rakismet_binding的用途

unless Rakismet::Base.rakismet_binding.nil? 
     { :referrer => 'request.referer', :user_ip => 'request.remote_ip', 
     :user_agent => 'request.user_agent' }.each_pair do |k,v| 
      data[k] = eval(v, Rakismet::Base.rakismet_binding) || '' 
     end 
    end 

以下的方法嗎?

module InstanceMethods 
    def spam? 
    data = akismet_data 

    unless Rakismet::Base.rakismet_binding.nil? 
     { :referrer => 'request.referer', :user_ip => 'request.remote_ip', 
     :user_agent => 'request.user_agent' }.each_pair do |k,v| 
      data[k] = eval(v, Rakismet::Base.rakismet_binding) || '' 
     end 
    end 

    self.akismet_response = Rakismet::Base.akismet_call('comment-check', data) 
    self.akismet_response == 'true' 
    end 

我發現其他引用在rakismet.rb rakismet_binding:

class Base 
    cattr_accessor :valid_key, :rakismet_binding 

和controller_extensions.rb:

def rakismet(&block) 
    Rakismet::Base.rakismet_binding = binding 
    yield 
    Rakismet::Base.rakismet_binding = nil 
end 
private :rakismet 

但我不知道它是。

回答

1

Kernel binding是一個特殊的對象,它持有包含所有實例變量的方法調用的上下文。 rakismet(&block)方法的作用是將當前綁定(ActionController實例)臨時分配給一個類變量,以便任何rakismet方法調用都可以訪問它,並執行該塊的內容。

下面的代碼片斷

unless Rakismet::Base.rakismet_binding.nil? 
    { :referrer => 'request.referer', :user_ip => 'request.remote_ip', 
    :user_agent => 'request.user_agent' }.each_pair do |k,v| 
     data[k] = eval(v, Rakismet::Base.rakismet_binding) || '' 
    end 
end 

檢查的結合是否是可用的,並且如果是這樣,它會嘗試自動地收集從當前綁定如ActionController的#request.referer,所述的ActionController#請求的某些信息。 remote_ip等等。

簡而言之,這是一種解決方法,可以從當前的ActionController請求中收集一些變量,否則Rakismet將無法使用這些變量。