Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 试图了解Base.rakismet_绑定的用途_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 试图了解Base.rakismet_绑定的用途

Ruby on rails 试图了解Base.rakismet_绑定的用途,ruby-on-rails,ruby,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.rakis

这部分是什么

    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_绑定的其他引用:

  class Base
    cattr_accessor :valid_key, :rakismet_binding
和控制器_extensions.rb:

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

但是我不知道它是干什么用的。

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

如果您查看该类的一些单元测试:

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

是一个特殊的对象,它包含一个包含所有实例变量的方法调用的上下文。
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将无法使用这些变量