Invoquer une fonction de application.rb dans une task


#1

Bonjour,

Je voulais écrire une tâche rake qui fait appel à une methode qui se
trouve dans mon fichier controllers/application.rb et je ne sais pas
comment faire car si je l’appelle en faisant
xx = ma_methode (y)
j’ai une erreur à l’execution
rake aborted!
undefined method ma_methode’ for main:Object

Merci


#2

2009/1/1 Nicolas:

Je voulais écrire une tâche rake qui fait appel à une methode qui se
trouve dans mon fichier controllers/application.rb et je ne sais pas
comment faire car si je l’appelle en faisant
xx = ma_methode (y)
j’ai une erreur à l’execution
rake aborted!
undefined method ma_methode’ for main:Object

Ce qui semble naturel, car il faut instancier un objet
ApplicationController avant de pouvoir lui envoyer un message.

Cela dit, plusieurs remarques :

1/ Tu nous parles de ton objectif (appeler une méthode d’instance
d’ApplicationController) mais en fait, c’est un objectif intermédiaire,
c’est plus un moyen, quel est véritablement ton objectif (d’où une
question annexe sous-jacente, que fait cette méthode ?)

2/ Est-ce que tu ne peux pas passer par http. Donc taper dans
une action qui appelerait ladite méthode.

3/ Est-ce que cette méthode manipule/a besoin de request/params/
response/flash/session…

L’autre manière de voir cette question est, est-ce que cette
méthode est indépendante en fait d’être une méthode de contrôleur,
ne peut-elle pas être extraite dans un module.

4/ Tu peux passer par une instance
d’ActionController::Integration::Session pour simuler le dialogue
HTTP

5/ N’y-a-t-il pas un problème de fond, de vouloir appeler une méthode
d’instance d’un objet d’une classe abstraite ?

Autre manière de dire : file-nous le code de cette méthode qu’on
comprenne ce que tu cherches réellement à faire.

– Jean-François.


http://twitter.com/underflow_


#3

Ok, il s’agit de mon site de recettes de cuisine, je suis en rails
1.2.6 et jusqu’à présent j’utilise permalink_fu pour générer une URL
“parlante”. Mais maintenant je trouve que c’est un peu lourd
d’utiliser ce plugin et en plus il ne sait pas transformer des accents
en lettre non accentué, donc j’ai décidé d’écrire une methode qui
génère une chaine de caractère remplaçant les accents. J’ai mis cette
méthode dans application.rb car je compte aussi l’utiliser pour les
Nouvelles que je publie. Voilà le code de la méthode
def remove_accents_and_blanks( str )
str_temp = str.clone
accents = { [‘á’,‘à’,‘â’,‘ä’,‘ã’,‘Ã’,‘Ä’,‘Â’,‘À’] => ‘a’,
[‘é’,‘è’,‘ê’,‘ë’,‘Ë’,‘É’,‘È’,‘Ê’] => ‘e’,
[‘í’,‘ì’,‘î’,‘ï’,‘I’,‘Î’,‘Ì’] => ‘i’,
[‘ó’,‘ò’,‘ô’,‘ö’,‘õ’,‘Õ’,‘Ö’,‘Ô’,‘Ò’] => ‘o’,
[‘œ’] => ‘oe’,
[‘ß’] => ‘ss’,
[‘ú’,‘ù’,‘û’,‘ü’,‘U’,‘Û’,‘Ù’] => ‘u’,
[’ '] => ‘-’
}
accents.each do |ac,rep|
ac.each do |s|
str_temp.gsub!(s, rep)
end
end
return str_temp
end

Elle fonctionne correctement, ce n’est pas la solution la plus
performante mais elle n’est appelée que rarement.
Ensuite afin de mettre à jour ma base, je voulais écrire une tâche
rake qui me permette de remplacer l’actuel “permalink” dont les
caractères accentués sont absents par un “permalink” plus lisible.


#4

Tranquiliste a écrit :

Ok, il s’agit de mon site de recettes de cuisine, je suis en rails
1.2.6 et jusqu’à présent j’utilise permalink_fu pour générer une URL
“parlante”. Mais maintenant je trouve que c’est un peu lourd
d’utiliser ce plugin et en plus il ne sait pas transformer des accents
en lettre non accentué, donc j’ai décidé d’écrire une methode qui
génère une chaine de caractère remplaçant les accents. J’ai mis cette
méthode dans application.rb car je compte aussi l’utiliser pour les
Nouvelles que je publie.

Tu peux peut être la mettre dans une lib ?

Voilà le code de la méthode

}

Tu peux faire plus élégant (voire plus performant ?) pour enlever les
accents, en utilisant iconv.
Il faut pour cela convertir la chaîne en ascii et enlever les caractères
de type '"¨ avec gsub.


Martin C. || fuse
http://www.noremember.org


#5

Merci


#6

2009/1/2 Tranquiliste :

Ok, il s’agit de mon site de recettes de cuisine, je suis en rails
1.2.6 et jusqu’à présent j’utilise permalink_fu pour générer une URL
“parlante”. Mais maintenant je trouve que c’est un peu lourd
d’utiliser ce plugin et en plus il ne sait pas transformer des accents
en lettre non accentué, donc j’ai décidé d’écrire une methode qui
génère une chaine de caractère remplaçant les accents. J’ai mis cette
méthode dans application.rb car je compte aussi l’utiliser pour les
Nouvelles que je publie.

Tu peux sans pb refactoriser ton code pour extraire cette méthode
dans un module à part, charger ce module au démarrage
de Rails, puis appeler depuis un helper/une action/un modèle
cette méthode au moment adéquat. Tu pourras l’appeler
depuis une tâche Rake également.

Ta méthode ne dépend que de l’argument d’entrée et
n’a pas d’effet de bord, ça ne pose pas de pb.

Remarque : utilise String#tr pour plus d’efficacité et
garde juste le gsub pour l’œ’ et l’ß.

– Jean-François.


http://twitter.com/underflow_


#7

Pour info, avec Rails 2.2 un simple “éàùoùuîöèè”.parameterize marche très bien.
=> “eauouuioee”