这部分是什么。 。 。
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
但我不知道它是为了什么。
答案 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
你可以看到它是如何使用的。