试图了解Base.rakismet_binding的用途

时间:2009-11-13 06:33:34

标签: ruby-on-rails ruby

这部分是什么。 。 。

    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

但我不知道它是为了什么。

2 个答案:

答案 0 :(得分: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#request.remote_ip等。

简而言之,这是从当前的ActionController请求中收集一些变量的解决方法,否则Rakismet将无法使用这些变量。

答案 1 :(得分:0)

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

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

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

你可以看到它是如何使用的。