Bir sınıf adını programlı olarak FooBar
sembole :foo_bar
nası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
Bir sınıf adını programlı olarak FooBar
sembole :foo_bar
nası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:
Rails, underscore
CamelCased 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 underscore
içine String
kendin (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
Raylar 4 .model_name
Rails 4'te, aşağıdakiler gibi ActiveModel::Name
birç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:
BTW, human
I18N 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.inspect
rails konsoluna veya hata ayıklayıcınıza yazın
classify
, modelize
işe yaramadı.
ilk: gem install activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
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 . :)
İş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
String#demodulize
daha önce parçayı kaldıracak olana sahiptir ::
.