2011-01-05 4 views
4

Je configure une nouvelle instance d'une application Rails (2.3.5) sur Heroku en utilisant Amazon RDS comme base de données. Je voudrais utiliser UTF-8 pour tout. Puisque RDS n'est pas UTF-8 par défaut, j'ai mis en place un nouveau groupe de paramètres et ai changé la base de données pour l'utiliser, essentiellement par this. Semble avoir travaillé:Impossible de stocker UTF-8 dans RDS malgré la configuration d'un nouveau groupe de paramètres utilisant Rails sur Heroku

SHOW VARIABLES LIKE '%character%'; 

character_set_client  utf8 
character_set_connection utf8 
character_set_database utf8 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  utf8 
character_set_system  utf8 
character_sets_dir  /rdsdbbin/mysql-5.1.50.R3/share/mysql/charsets/ 

De plus, j'ai réussi à configurer Heroku pour utiliser la base de données RDS. Après rake db: migrate, tout semble bon:

CREATE TABLE `comments` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `commentable_id` int(11) DEFAULT NULL, 
    `parent_id` int(11) DEFAULT NULL, 
    `content` text COLLATE utf8_unicode_ci, 
    `child_count` int(11) DEFAULT '0', 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `commentable_id` (`commentable_id`), 
    KEY `index_comments_on_community_id` (`community_id`), 
    KEY `parent_id` (`parent_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Dans le balisage, j'ai inclus:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Aussi, je me suis fixé:

production: 
    encoding: utf8 
    collation: utf8_general_ci 

... dans le database.yml, bien que je ne sois pas très confiant que quelque chose soit fait pour honorer n'importe lequel de ces paramètres dans ce cas, car Heroku semble faire sa propre configuration en se connectant à RDS.

Maintenant, j'entrer un commentaire via le formulaire dans l'application: « Úbe® ƒåiL », mais dans la base de données que j'ai « Úbe® Æ'à ¥ iL »

Il semble bien quand Rails le charge en dehors de la base de données et il est rendu à la page, donc quoi qu'il fasse d'une manière, il se défait dans l'autre sens. Si je regarde la base de données RDS dans Sequel Pro, il semble bien si je mets l'encodage à "UTF-8 Unicode via Latin 1". Donc, il semble que Latin-1 se faufile quelque part.

Tout fonctionne en développement, lors de la connexion à une base de données MySQL locale.

Quelqu'un doit avoir déjà fait ça, n'est-ce pas? Qu'est-ce que je rate?

+0

Je voudrais voir si ce qui se passe si je mets à init_connect "SET NAMES utf8", mais je ne peux pas savoir comment faire avec l'interface de ligne de commande RDS. Je renvoie une erreur car elle semble s'étouffer lorsque je définis une valeur avec des espaces. Vous ne savez pas comment le faire. – Lail

Répondre

5

Il existe un moyen plus simple. Vous pouvez spécifier l'encodage dans votre chaîne de connexion DB. Modifier le module complémentaire RDS, et ajouter ?encoding=utf8&collation=utf8_general_ci

A bien fonctionné pour moi, pas de modifications au projet.

par exemple:

mysql://user:[email protected]/my-db?encoding=utf8&collation=utf8_general_ci 

Référence: http://blog.arvidandersson.se/2011/09/27/setting-activerecord-connection-to-utf8-on-heroku

+2

Une note à ce sujet, si vous utilisez la gemme 'mysql2', puis l'URL dans ma réponse devient' mysql2: // etc ... ' –

+0

Il est également intéressant de souligner que la chaîne de connexion doit être entourée de guillemets dans ce cas. Par exemple: 'addons heroku: add amazon_rds --url =" mysql2: // utilisateur: [email protected]/mon-db? encoding = utf8 & collation = utf8_general_ci "' –

2

En fin de compte, je résolu mon problème en ajoutant ce qui suit dans les rails :: bloc Initializer.run dans le environment.rb

class Rails::Configuration 
    def database_configuration 
    # Heroku overwrites the database.yml file without setting any encoding when deploying to outside server (like Amazon RDS)  
    require 'erb' 
    YAML::load(ERB.new(IO.read(database_configuration_file)).result).each_value {|env| env.merge!({"encoding" => "utf8", "collation" => "utf8_general_ci"}) } 
    end 
end 

Heroku écrase le fichier database.yml et ne comprend aucun codage ou d'une coalition paramètres. En le piratant ainsi, les paramètres corrects sont toujours fusionnés avant la connexion à la base de données.

Questions connexes