मैं एक रूबी वर्ग नाम को अंडरस्कोर-सीमांकित प्रतीक में कैसे परिवर्तित करूं?


95

मैं प्रोग्राम FooBarको प्रतीक रूप में एक वर्ग नाम कैसे बदल सकता हूं :foo_bar? कुछ इस तरह से, लेकिन यह ऊंट मामले को ठीक से संभालता है?

FooBar.to_s.downcase.to_sym

जवाबों:


141

रेल्स एक विधि के साथ आती है जिसे कहा जाता है 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

1
धन्यवाद। मुझे डर था कि यह एक रेल विस्तार था। :) कोई चिंता नहीं, क्योंकि मैं वास्तव में रेल का उपयोग कर रहा हूं।
जोश ग्लोवर

2
तब आपको अपने प्रश्न को उसी के अनुसार टैग करना चाहिए था। यहाँ, मुझे यह तुम्हारे लिए है ...
kikito

5
नहीं, ActiveRecord नहीं। ActiveSupport।
रीन हेनरिक्स

वास्तव में, मैं इसे बदल देता हूं
kikito

2
रिवर्स कैसे करें?
user1406062

72

रेलें ४ .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, humanI18N जागरूक होने का फायदा है।


model_nameउदाहरण के लिए भी काम करता है वस्तुओं। उदाहरण के लिए: foo_bar.model_name। यदि आप पूरी सूची foo_bar.model_name.inspectरेल कंसोल या अपने डिबगर में लिखना चाहते हैं
ivanxuu

और मैं इसके विपरीत / रिवर्स की तलाश में था classify, modelizeकाम नहीं कर रहा था।
पिसिस

7

पहले: मणि स्थापित activesupport

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

होना चाहिए FooBar.to_s.underscore.to_sym, क्योंकि मैं एक वर्ग (जो एक स्थिर है) को एक प्रतीक में बदलने की कोशिश कर रहा हूं, जिसे मैं फिर फैक्टरी गर्ल को खिला सकता हूं । :)
जोश ग्लोवर

2

यहाँ मैं क्या गया है:

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#demodulizeवह हिस्सा है जो पहले हटा देगा ::
अमीबे

@amoebe - जानकारी के लिए धन्यवाद। इस बात पर निर्भर करता है कि आपका काम क्या है - आप रेल एप्लिकेशन (या एक वेब ऐप) पर भी काम नहीं कर रहे हैं।
लुईस सेपर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.