2012-07-23 4 views
1

J'ai du code pour ajouter des méthodes à un module à partir de définitions simples pour parler à des ressources distantes via une classe wrapper autour d'un client REST.Erreur Regex dans le bloc class-eval

def service_function(function_name, method, uri, parameters) 
    class_eval <<-RUBY 
    def #{function_name}(params) 
     if !(#{function_name}_required_params - params.keys).empty? || \ 
      !(params.keys - #{function_name}_params).empty? 
     raise Errors::InvalidParameters.new(service_name, __method__, 
              params.keys, #{function_name}_params) 
     end 
     WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params) 
    end 

    def #{function_name}_params 
     #{function_name}_required_params + #{function_name}_optional_params 
    end 

    def #{function_name}_required_params 
     #{parameters}.select { |param,req| req }.keys 
    end 

    def #{function_name}_optional_params 
     #{parameters}.select { |param,req| !req }.keys 
    end 
    RUBY 
end 

Avant que je puisse même exécuter le code, juste exigeant la pierre précieuse Je construis dans la CISR recrache cette erreur:

1.9.2p320 :001 > require 'web-services' 
SyntaxError: (eval):7: unknown regexp options - rt 

La ligne incriminée est:

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params) 

Retrait l'argument "# {uri}" le répare, quitte même dans l'argument "# {méthode}". Est-ce que quelqu'un là-bas a une idée de la raison pour laquelle cela pourrait être? Je suis à la fin de mon esprit.

Répondre

1

Vous avez un url qui ressemble à /something/rt et qui ressemble à un littéral regex ici:

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params) 

Vous devez échapper et citation #{uri} pour qu'il ressemble à une chaîne dans la heredoc, que façon class_eval verra perform(..., '/something/rt', ...) et être heureux. Vous pourriez avoir des problèmes similaires avec #{method}.

+0

La chose est que je ne passe rien pour le moment, ce n'est que sur exiger. Quand j'enlève # {uri} ça fonctionne parfaitement. * EDIT * Peu importe, j'ai trouvé une ligne de code égarée provenant d'un test précédent qui était en cours d'exécution pendant l'étape require. Je me sens un peu bête maintenant. Merci pour la réponse. =) – user1034016

+0

Pour la postérité et google, la solution était de remplacer # {uri} par "# {uri}". – user1034016

+0

@ user1034016: Cela devrait être sûr, mais les vrais paranoïaques voudraient s'assurer que 'uri' n'a pas de guillemets doubles ou faire quelque chose comme' "# {uri.inspect}" 'pour les faire échapper. –