IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Rake, Active Record et accent


Sujet :

Ruby on Rails

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Rake, Active Record et accent
    Bonjour à tous,

    je suis confronté à un problème dont je ne me sort pas.

    J'ai besoin de créer des enregistrements dans ma base de données (MySQL 5) à partir d'une tache rake... et ces enregistrements doivent pouvoir contenir des caractères accentués. Naturellement, j'ai donc fait une tache rake qui ressemble à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      task :test => :environment do
    	 Item.create(:name => "avec des é et des à")
      end
    en lancement la tache rake, le log de l'appli rails indique que le code sql suivant est généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL (0.000000)   SET NAMES 'UTF8'
    SQL (0.000000)   SET SQL_AUTO_IS_NULL=0
    Ad Columns (0.000000)   SHOW FIELDS FROM `items`
    SQL (0.000000)   BEGIN
    Item Create (0.156000)   INSERT INTO `items` (`name`) VALUES('avec des é et des à')
    SQL (0.063000)   COMMIT
    Jusque là tout va bien... mais quand je regard dans ma base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mysql > select name from items;
     
    +-----------+
    | name      |
    +-----------+
    | avec des  |
    +-----------+
    1 row in set (0.00 sec)
    J'ai beau tout essayé, je n'arrive pas à envoyer des accents dans la db via une tâche rake.
    Tout fonctionne au niveau de l'appli rails via un navigateur.
    Mon fichier database.yml indique bien encoding: UTF8

    Ma base de données est bien en UT8
    J'ai même été modifié le my.ini en rajoutant
    [mysqld]
    character-set-server = utf8

    [client]
    default-character-set = utf8

    Tout ça sans succès. Je vois pas ce qui cloche.
    Je suis sous rails 2.0.1 / MySql 5 / Win XP2 (et je peux reproduire le pb sous Debian Etch)

    Merci pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Les problèmes d'encodages, c'est vraiment chiant. Faudrait que t'essaye d'isoler la zone, par exemple si tu te connectes directement a ton serveur MySQL et que tu tapes ta requete SQL "a la mano", est ce que ca marche ?

    Autre point, ton fichier rake est il bien encodé également en UTF8 (sans BOM si possible) ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    j'ai bien essayé de rentrer les requêtes SQL directement dans la base et ca fonctionne parfaitement, par contre depuis la console rails (Item.create(:name=> "avec des é et des à")), je fais planter la console.

    Je crois vraiment que ca vient de ruby qui gère pas bien l'utf8 alors que rails le gère un peu mieux.

    Pour avancer, je suis donc repasser en format latin1 sur la base de données et les scripts rake fonctionnent bien, mais il a fallut faire les modifications suivantes dans application.rb pour mettre rails au format latin1 car par défaut rails 2.0 fonctionne en utf8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     after_filter :set_charset
      before_filter :convert_xhr
     
      ICONV = Iconv.new('ISO-8859-1', 'UTF-8')
     
      def convert_xhr
        convert_hash(params) if request.xhr?
      end
     
      def convert_hash(hash)
        for k, v in hash
          case v
          when String: hash[k] = ICONV.iconv(v)
          when Array: hash[k] = v.collect { |v| ICONV.iconv(v) }
          when Hash: convert_hash(v)
          end
        end
      end
     
      def set_charset
        content_type = headers["Content-Type"] || 'text/html'
        if /^text\//.match(content_type)
          headers["Content-Type"] = "#{content_type}; charset=latin1" 
        end
      end

Discussions similaires

  1. adodb Active Record -- qqn aime ? c'est bien ?
    Par fourchette dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/07/2009, 09h45
  2. Active Record Timestamps
    Par gentil dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 16/06/2008, 13h38
  3. [POO] Différence entre ORM et Active Record ?
    Par Jokaritaff dans le forum Langage
    Réponses: 6
    Dernier message: 25/05/2008, 16h10
  4. collection d'objet active record
    Par penguin50 dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 10/03/2008, 15h10
  5. Réponses: 2
    Dernier message: 02/04/2007, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo