2010-11-29 19 views
0

J'ai un plugin personnalisé (je ne l'ai pas écrit) qui ne fonctionne pas sur les rails 3, mais il a fonctionné avec les rails 2. Il s'agit d'un schéma d'authentification personnalisé, voici ce que le module principal ressemble à:Rails 3- Le plugin retourne 'variable locale non définie'

#lib/auth.rb 
module ActionController 

    module Verification 
    module ClassMethods 
     def verify_identity(options = {}) 
     class_eval(%(before_filter :validate_identity, :only => options[:only], :except => options[:except])) 
     end 
    end 
    end 

    class Base 
    #some configuration variables in here 

    def validate_identity 
     #does stuff to validate the identity 
    end 
    end 

end 

#init.rb 
require 'auth' 
require 'auth_helper' 
ActionView::Base.send(:include, AuthHelper) 

AuthHelper contient une méthode simple d'aide pour l'authentification, la base sur une appartenance à un groupe.

Quand j'INCLUDE 'verify_identity' sur un ActionController:

class TestController < ApplicationController 
    verify_identity 
    .... 
end 

Je reçois une erreur de routage: variable locale non définie ou méthode `verify_identity » pour TestController: classe. Des idées comment je peux résoudre ce problème? Merci!

Répondre

3

Cela a fonctionné en 2.3 car il y avait un module ActionController::Verification là-bas. Cela ne fonctionne pas dans la version 3.0 car ce module n'existe pas. Plutôt que de compter sur Rails d'avoir un module que vous pouvez brancher dans, définir votre propre comme ceci:

require 'active_support/concern' 
module Your 
    module Mod 
    extend ActiveSupport::Concern 
    module ClassMethods 
     def verify_identity(options = {}) 
     # code goes here 
     end 
    end 
    end 
end 

et utilisation:

ActionController :: Base.send (: include, votre Mod ::)

Pour rendre ses fonctions disponibles. ActiveSupport::Concern vous permet d'avoir un module ClassMethods et InstanceMethods à l'intérieur de votre module et il prend soin de charger les méthodes dans ces modules dans les zones correctes de tout ce qui est inclus dans le module.