Forum: Rails France Invoquer une fonction de application.rb dans une task

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Tranquiliste (Guest)
on 2009-01-02 00:17
(Received via mailing list)
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
Jean-François Trân (Guest)
on 2009-01-02 15:12
(Received via mailing list)
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_
Tranquiliste (Guest)
on 2009-01-02 15:31
(Received via mailing list)
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.
Martin C. (Guest)
on 2009-01-02 15:45
(Received via mailing list)
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
Jean-François Trân (Guest)
on 2009-01-02 15:48
(Received via mailing list)
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_
Tranquiliste (Guest)
on 2009-01-02 18:32
(Received via mailing list)
Merci
Tricia M. (Guest)
on 2009-01-16 12:40
Pour info, avec Rails 2.2 un simple "éàùoùuîöèè".parameterize marche très bien.
=> "eauouuioee"
This topic is locked and can not be replied to.