定义后自动更改变量值

时间:2013-10-21 07:16:38

标签: ruby rspec

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

@book = Book.new

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

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

1 个答案:

答案 0 :(得分: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"

你必须自己决定这是否符合你的需要,但你得到了基本的想法。