试图了解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
你可以看看它的使用。