ฉันจะเปลี่ยนชื่อคลาสFooBar
เป็นสัญลักษณ์โดยทางโปรแกรมได้:foo_bar
อย่างไร เช่นอะไรทำนองนี้ แต่ที่จับอูฐอย่างถูกต้อง?
FooBar.to_s.downcase.to_sym
ฉันจะเปลี่ยนชื่อคลาสFooBar
เป็นสัญลักษณ์โดยทางโปรแกรมได้:foo_bar
อย่างไร เช่นอะไรทำนองนี้ แต่ที่จับอูฐอย่างถูกต้อง?
FooBar.to_s.downcase.to_sym
คำตอบ:
Rails มาพร้อมกับวิธีการที่เรียกunderscore
ว่าจะช่วยให้คุณสามารถแปลงสตริง CamelCased เป็นสตริง underscore_separated ดังนั้นคุณอาจสามารถทำได้:
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
ราง 4 .model_name
ใน Rails 4 จะส่งคืนไฟล์ ActiveModel::Name
อ็อบเจ็กต์ที่มีแอตทริบิวต์ "semantic" ที่มีประโยชน์มากมายเช่น:
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
เพราะฉันกำลังพยายามแปลงคลาส (ซึ่งเป็นค่าคงที่) เป็นสัญลักษณ์ซึ่งฉันสามารถป้อนให้กับFactory Girlได้ :)
นี่คือสิ่งที่ฉันทำเพื่อ:
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
::