मैं प्रोग्राम FooBar
को प्रतीक रूप में एक वर्ग नाम कैसे बदल सकता हूं :foo_bar
? कुछ इस तरह से, लेकिन यह ऊंट मामले को ठीक से संभालता है?
FooBar.to_s.downcase.to_sym
मैं प्रोग्राम FooBar
को प्रतीक रूप में एक वर्ग नाम कैसे बदल सकता हूं :foo_bar
? कुछ इस तरह से, लेकिन यह ऊंट मामले को ठीक से संभालता है?
FooBar.to_s.downcase.to_sym
जवाबों:
रेल्स एक विधि के साथ आती है जिसे कहा जाता है underscore
कि आप कैमलकेड स्ट्रिंग्स को अंडरस्कोर_सेप्ड स्ट्रिंग्स में बदल सकते हैं। तो आप ऐसा करने में सक्षम हो सकते हैं:
FooBar.name.underscore.to_sym
लेकिन आपको ऐसा करने के लिए ActiveSupport स्थापित करना होगा, जैसा कि ipsum कहता है।
आप सिर्फ इतना है कि के लिए ActiveSupport स्थापित करने के लिए नहीं करना चाहते हैं, आप कर सकते हैं बंदर-पैच underscore
में String
अपने आप को (अंडरस्कोर समारोह में परिभाषित किया गया है 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
रेलें ४ .model_name
रेल 4 में, यह एक ActiveModel::Name
वस्तु देता है जिसमें कई उपयोगी अधिक "अर्थ" गुण होते हैं जैसे:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
तो आपको उनमें से एक का उपयोग करना चाहिए यदि वे आपके इच्छित अर्थ से मेल खाते हैं, जो कि मामला है। लाभ:
BTW, human
I18N जागरूक होने का फायदा है।
model_name
उदाहरण के लिए भी काम करता है वस्तुओं। उदाहरण के लिए: foo_bar.model_name
। यदि आप पूरी सूची foo_bar.model_name.inspect
रेल कंसोल या अपने डिबगर में लिखना चाहते हैं
classify
, modelize
काम नहीं कर रहा था।
पहले: मणि स्थापित activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, क्योंकि मैं एक वर्ग (जो एक स्थिर है) को एक प्रतीक में बदलने की कोशिश कर रहा हूं, जिसे मैं फिर फैक्टरी गर्ल को खिला सकता हूं । :)
यहाँ मैं क्या गया है:
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
वह हिस्सा है जो पहले हटा देगा ::
।