211 votes

Conversion d'une chaîne de caractères de snake_case en CamelCase en Ruby

J'essaie de convertir un nom de snake case en camel case. Existe-t-il des méthodes intégrées ?

Eg : "app_user" a "AppUser"

(J'ai une chaîne "app_user" Je veux convertir ça en modèle AppUser ).

0 votes

312voto

Sergio Tulentsev Points 82783

Si vous utilisez Rails, Chaîne#camelize est ce que vous recherchez.

  "active_record".camelize                # => "ActiveRecord"
  "active_record".camelize(:lower)        # => "activeRecord"

Si vous voulez obtenir une classe réelle, vous devez utiliser Chaîne#constancier en plus de cela.

"app_user".camelize.constantize

48 votes

Vous devriez ajouter que c'est un ajout de Rails à String, cela ne fonctionne pas avec Ruby pur.

3 votes

C'est marqué ruby-on-rails donc, je suppose, que ce n'est pas un problème. Mais merci de l'avoir mentionné.

7 votes

Il n'est pas nécessaire de caméliser avant de constancier. Utilisez #classify à la place. "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"

146voto

user3869936 Points 81

Et celui-là ?

"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"

Trouvé dans les commentaires ici : Classifier une chaîne Ruby

Voir le commentaire de Wayne Conrad

11 votes

Vous êtes géniale, merci. Je ne voulais pas avoir à inclure des bibliothèques de rails juste pour une tâche aussi petite. C'est magnifique :)

12 votes

C'est l'une des seules véritables réponses à la question. Ne pas utiliser les bibliothèques Rails.

51voto

Harish Shetty Points 38877

Si vous utilisez Rails, utilisez classify . Il gère bien les cas limites.

"app_user".classify # => AppUser
"user_links".classify   # => UserLink

Note :

Cette réponse est spécifique à la description donnée dans la question (elle n'est pas spécifique au titre de la question). Si quelqu'un essaie de convertir une chaîne de caractères en minuscules, il doit utiliser la méthode suivante Sergio Réponse de la Commission. L'auteur de la question déclare qu'il veut convertir app_user a AppUser (pas App_user ), d'où cette réponse..

4 votes

Pour les environnements Rails, c'est parfait.

0 votes

Notez que classify renvoie une chaîne de caractères, vous devez appeler constantize ensuite pour la convertir en une classe réelle.

2 votes

Une mise en garde importante concernant classify c'est que les chaînes pluralisées deviennent singulières... 'age_in_years'.classify devient AgeInYear

26voto

Mr. Black Points 2342

Source : http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method

À des fins d'apprentissage :

class String
  def camel_case
    return self if self !~ /_/ && self =~ /[A-Z]+.*/
    split('_').map{|e| e.capitalize}.join
  end
end

"foo_bar".camel_case          #=> "FooBar"

Et pour la variante lowerCase :

class String
  def camel_case_lower
    self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
  end
end

"foo_bar".camel_case_lower          #=> "fooBar"

8 votes

@pguardiario si la roue est appelée ActiveSupport s'il vous plaît, réinventez-le.

0 votes

Je pense que la variante lowerCase est fausse. Le bloc d'injection ne devrait pas manipuler directement le tampon mais retourner la nouvelle valeur du tampon : self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join

12voto

mike Points 46

Je suis venu ici en cherchant l'inverse de ta question, en passant de l'étui à chameau à l'étui à serpent. Utilisez soulignement pour cela (ne pas décamériser) :

AppUser.name.underscore # => "app_user"

ou, si vous avez déjà une chaîne de caractères avec des majuscules :

"AppUser".underscore # => "app_user"

ou, si vous voulez obtenir le nom de la table, ce qui est probablement la raison pour laquelle vous voulez le cas du serpent :

AppUser.name.tableize # => "app_users"

0 votes

Pourquoi ne pas utiliser AppUser.table_name ? Vous vous assurerez également d'avoir le vrai nom de la table si ce n'est pas app_users, mais quelque chose de défini ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X