2013-10-21 38 views
-1

我嘗試寫一些代碼來滿足這個RSpec的要求(有刪節)自動改變量值

@book = Book.new 

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

我不知道人們會怎麼做@book.title變化從「地獄」到「地獄「自動定義後,我也不知道在哪裏尋找。我查看了實例變量和初始化文檔的文檔,但解決方案從兩者都沒有明確。

回答

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" 

你必須自己決定這是否滿足您的需要或沒有,但你的基本思路。

+0

什麼是「str」? – macsplean

+0

這是setter方法的參數,即等號的右側值。例如,當您調用'@book.title ='foobar''時,字符串''foobar''將作爲參數提供。在這種情況下,這個參數被稱爲'str',但是您可以根據需要命名它。 –

+0

好吧,在我看來,'self.title ='而不是'self [:title] ='或'write_attribute(:title,')可能更容易一些,但也許它並不重要,具體而言,我不確定 – macsplean