我正在尝试编写一些代码来满足这个 RSpec 要求(删节)
@book = Book.new
@book.title = "inferno"
@book.title.should == "Inferno"
我不确定@book.title
一旦定义后如何自动从“inferno”更改为“Inferno”,我也不知道在哪里看。我查看了实例变量的文档和初始化的文档,但解决方案都变得很清楚。
您可以通过覆盖 setter 方法来实现这一点:
class Book < ActiveRecord::Base
# other stuff ...
def title=(str)
write_attribute(:title, str.capitalize)
end
end
或者,或者:
class Book < ActiveRecord::Base
# other stuff ...
def title=(str)
self[:title] = str.capitalize
end
end
您可能需要考虑额外的处理,因为String#capitalize
可能不足以满足您的需求。例子:
'foo'.capitalize
#=> "Foo"
'foo of bar'.capitalize
#=> "Foo of bar"
一种可能的解决方案如下:
'foo'.split.map(&:capitalize).join(' ')
#=> "Foo"
'foo of bar'.split.map(&:capitalize).join(' ')
#=> "Foo Of Bar"
但请注意,这会带来不同的问题。最值得注意的是,这将丢弃任何前导、尾随和重复的空格:
' foo of bar '.split.map(&:capitalize).join(' ')
#=> "Foo Of Bar"
您必须自己决定这是否满足您的需求,但您了解基本概念。