2009-11-13 4 views
0

Qu'est-ce que cette partie. . .Essayer de comprendre ce que Base.rakismet_binding est pour

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 

du procédé suivant?

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 

J'ai trouvé d'autres références à rakismet_binding dans rakismet.rb:

class Base 
    cattr_accessor :valid_key, :rakismet_binding 

et controller_extensions.rb:

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

Mais je ne sais pas ce qu'il est pour.

Répondre

1

Le Kernel binding est un objet spécial contenant le contexte d'un appel de méthode incluant toutes les variables d'instance. La méthode rakismet(&block) consiste à assigner temporairement la liaison en cours (l'instance ActionController) à une variable de classe afin qu'elle puisse être accessible par n'importe quel appel de méthode rakismet et exécuter le contenu du bloc.

Le fragment de code suivant

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 

vérifie si une liaison est disponible et si oui, il tente de recueillir automatiquement des informations à partir du courant de liaison tels que le ActionController # request.referer, la demande de # ActionController. remote_ip et ainsi de suite. En quelques mots, il s'agit d'une solution de contournement pour collecter certaines variables de votre requête ActionController en cours, qui ne seront autrement pas disponibles pour Rakismet.

Questions connexes