-1

我正在尝试编写一些代码来满足这个 RSpec 要求(删节)

@book = Book.new

@book.title = "inferno"
@book.title.should == "Inferno"

我不确定@book.title一旦定义后如何自动从“inferno”更改为“Inferno”,我也不知道在哪里看。我查看了实例变量的文档和初始化的文档,但解决方案都变得很清楚。

4

1 回答 1

3

您可以通过覆盖 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"

您必须自己决定这是否满足您的需求,但您了解基本概念。

于 2013-10-21T07:18:19.057 回答