Làm cách nào để tôi có thể lập trình biến tên lớp FooBar
thành một ký hiệu :foo_bar
? ví dụ như một cái gì đó như thế này, nhưng xử lý trường hợp lạc đà đúng cách?
FooBar.to_s.downcase.to_sym
Làm cách nào để tôi có thể lập trình biến tên lớp FooBar
thành một ký hiệu :foo_bar
? ví dụ như một cái gì đó như thế này, nhưng xử lý trường hợp lạc đà đúng cách?
FooBar.to_s.downcase.to_sym
Câu trả lời:
Rails đi kèm với một phương thức được gọi là underscore
sẽ cho phép bạn chuyển đổi các chuỗi CamelCased thành các chuỗi underscore_separated. Vì vậy, bạn có thể làm điều này:
FooBar.name.underscore.to_sym
Nhưng bạn sẽ phải cài đặt ActiveSupport để làm điều đó, như ipsum nói.
Nếu bạn không muốn cài đặt ActiveSupport chỉ cho điều đó, bạn có thể khỉ vá underscore
vào String
chính mình (chức năng gạch dưới được định nghĩa trong 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
Đường ray 4 .model_name
Trong Rails 4, nó trả về một ActiveModel::Name
đối tượng chứa nhiều thuộc tính "ngữ nghĩa" hữu ích hơn như:
FooBar.model_name.param_key
#=> "foo_bar"
FooBar.model_name.route_key
#=> "foo_bars"
FooBar.model_name.human
#=> "Foo bar"
Vì vậy, bạn nên sử dụng một trong số đó nếu chúng phù hợp với ý nghĩa mong muốn của bạn, điều này có khả năng xảy ra. Ưu điểm:
BTW, human
có lợi thế là nhận biết I18N.
model_name
cũng hoạt động cho các đối tượng ví dụ. Ví dụ: foo_bar.model_name
. Nếu bạn muốn danh sách ghi đầy đủ foo_bar.model_name.inspect
trong đường ray giao diện điều khiển hoặc debugger của bạn
classify
, modelize
dường như không làm việc.
đầu tiên: gem cài đặt activesupport
require 'rubygems'
require 'active_support'
"FooBar".underscore.to_sym
FooBar.to_s.underscore.to_sym
, vì tôi đang cố chuyển đổi một lớp (là hằng số) thành một biểu tượng, sau đó tôi có thể cấp cho Factory Girl . :)
Đây là những gì tôi đã làm:
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
mà sẽ loại bỏ phần trước đó ::
.