আমি কীভাবে প্রোগ্রামে কোনও শ্রেণীর নামকে, FooBar
একটি প্রতীক হিসাবে রূপান্তর করতে পারি :foo_bar
? উদাহরণস্বরূপ এই জাতীয় কিছু, কিন্তু উটের কেসটি সঠিকভাবে পরিচালনা করে?
FooBar.to_s.downcase.to_sym
আমি কীভাবে প্রোগ্রামে কোনও শ্রেণীর নামকে, FooBar
একটি প্রতীক হিসাবে রূপান্তর করতে পারি :foo_bar
? উদাহরণস্বরূপ এই জাতীয় কিছু, কিন্তু উটের কেসটি সঠিকভাবে পরিচালনা করে?
FooBar.to_s.downcase.to_sym
উত্তর:
রেলগুলি এমন একটি পদ্ধতি নিয়ে আসে underscore
যা আপনাকে ক্যামেলকেসড স্ট্রিংগুলিকে আন্ডারস্কোর_সামান্য স্ট্রিংগুলিতে রূপান্তর করতে দেয়। সুতরাং আপনি এটি করতে সক্ষম হতে পারে:
FooBar.name.underscore.to_sym
আইপসাম যেমন বলে ঠিক তেমনটি করার জন্য আপনাকে অ্যাক্টিভসপোর্টটি ইনস্টল করতে হবে।
আপনি যদি কেবল তার জন্য অ্যাক্টিভসপোর্টটি ইনস্টল করতে না চান তবে আপনি নিজের underscore
মধ্যে বানর-প্যাচ করতে পারেন String
(আন্ডারস্কোর ফাংশনটি অ্যাক্টিভসপোর্ট :: ইনফ্ল্যাক্টারে সংজ্ঞায়িত হয়েছে ):
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
রেল 4 .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
কাজ বলে মনে হচ্ছে নি।
প্রথম: মণি ইনস্টল সক্রিয় সমর্থন
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
যা অংশটি আগে সরিয়ে ফেলবে ::
।