试图了解Base.rakismet_binding的用途

问题描述:

这部分是什么。 。 。试图了解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 

但我不知道它是。

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将无法使用这些变量。

最后一个代码片段几乎表明它的意图 - 它将以块形式使用并包装当前绑定。

如果你看一些单元测试这个类:

http://github.com/jfrench/rakismet/blob/master/spec/models/model_extension_spec.rb?raw=true

你可以看看它的使用。