Bir Ruby sınıf adını alt çizgi ile ayrılmış bir sembole nasıl dönüştürebilirim?


98

Bir sınıf adını programlı olarak FooBarsembole :foo_barnasıl dönüştürebilirim ? örneğin bunun gibi bir şey, ama bu deve durumunu düzgün bir şekilde ele alıyor mu?

FooBar.to_s.downcase.to_sym

Yanıtlar:


145

Rails, underscoreCamelCased dizelerini altçizgi_size ayrılmış dizelere dönüştürmenize olanak tanıyan bir yöntemle gelir . Yani bunu yapabilirsiniz:

FooBar.name.underscore.to_sym

Ancak ipsum'un dediği gibi, bunu yapmak için ActiveSupport'u yüklemeniz gerekecek.

Sadece bunun için ActiveSupport yüklemek istemiyorsanız, şunları yapabilirsiniz maymun yama underscoreiçine Stringkendin (alt çizgi fonksiyonu tanımlanır ActiveSupport :: Inflector ):

class String
  def underscore
    word = self.dup
    word.gsub!(/::/, '/')
    word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
    word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
    word.tr!("-", "_")
    word.downcase!
    word
  end
end

1
Teşekkürler. Bunun bir Rails eklentisi olmasından korkuyordum. :) Aslında Rails kullandığım için endişelenmeyin.
Josh Glover

2
O zaman sorunuzu buna göre etiketlemelisiniz. İşte, senin için yapmama izin ver ...
kikito

5
Hayır, ActiveRecord değil. ActiveSupport.
Rein Henrichs

Gerçekten, değiştirmeme izin ver
kikito

2
tersi nasıl yapılır?
user1406062

73

Raylar 4 .model_name

Rails 4'te, aşağıdakiler gibi ActiveModel::Namebirçok yararlı daha "anlamsal" öznitelik içeren bir nesne döndürür :

FooBar.model_name.param_key
#=> "foo_bar"

FooBar.model_name.route_key
#=> "foo_bars"

FooBar.model_name.human
#=> "Foo bar"

Dolayısıyla, istediğiniz anlamla eşleşiyorlarsa bunlardan birini kullanmalısınız, muhtemelen durum budur. Avantajlar:

  • kodunuzu anlamak daha kolay
  • Uygulamanız, Rails'in bir adlandırma kuralını değiştirmeye karar verdiği (olası olmayan) olayda bile çalışmaya devam edecektir.

BTW, humanI18N farkında olma avantajına sahiptir.


model_nameörneğin nesneler için de çalışır. Ör: foo_bar.model_name. Tam listeyi istiyorsanız foo_bar.model_name.inspectrails konsoluna veya hata ayıklayıcınıza yazın
ivanxuu

ve tersini / tersini arıyordum classify, modelizeişe yaramadı.
Pysis

7

ilk: gem install activesupport

require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym

Olmalı FooBar.to_s.underscore.to_sym, çünkü bir sınıfı (sabit olan) bir sembole dönüştürmeye çalışıyorum, sonra bunu Factory Girl'e besleyebilirim . :)
Josh Glover

2

İşte bunun için gittim:

module MyModule
  module ClassMethods
    def class_to_sym  
      name_without_namespace = name.split("::").last
      name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end
end

class ThisIsMyClass
  include MyModule
end 

ThisIsMyClass.class_to_sym #:this_is_my_class

3
ActiveSupport, String#demodulizedaha önce parçayı kaldıracak olana sahiptir ::.
amoebe

@amoebe - bilgi için teşekkürler. Ne üzerinde çalıştığınıza bağlıdır - bir ray uygulaması (veya hatta bir web uygulaması) üzerinde çalışmıyor olabilirsiniz.
Louis Sayers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.