2010-05-08 51 views
50

您何時在Rails模型中使用attr_reader/attr_writer/attr_accessorattr_accessor在Rails中的用法

+1

我猜你的意思是attr_accessor? – 2010-05-08 05:58:52

+0

啊對。謝謝。 – Ethan 2010-05-08 21:53:34

回答

50

attr_accessor可用於您不想直接存儲在數據庫中的值,並且只存在於對象的生命週期(例如密碼)中。

attr_reader可以作爲幾種選擇之一,做這樣的事情:

def instance_value 
    "my value" 
end 
62

永遠不要,除非你有特殊的需要。自動數據庫支持的訪問器爲您創建,所以您不必擔心。

任何你創建的attr_accessor都會改變rails對象上的相關@attr,但是當對象被銷燬的時候這個對象會丟失,除非你把它粘回到數據庫中。有時你確實需要這種行爲,但在Rails應用程序中這是不尋常的。

現在在紅寶石中,這是一個不同的故事,你最終會頻繁使用它們。但是如果你需要他們的話,我會很驚訝 - 尤其是最初。

+4

完美 - 謝謝。 (我會加上投票你,但我剛剛在這裏,我似乎首先需要15pts ...該機制似乎對新用戶不友好。) – Ethan 2010-05-08 21:57:38

+2

注意:從Rails 3.x開始attr_accessible是必需的默認情況下)爲每個模型的屬性,你想允許寫入(例如通過表單POST)。爲了向後兼容,這可以在'application.rb'中修改,但是作爲一個安全措施被添加,要求你明確地將用戶可更新的屬性列入白名單。作爲一個附加的好處,模型中的所有屬性(db列)都可以在模型中看到,因此您不必記住該列的命名方式:-) – 2012-06-29 15:25:26

0

一個示例是在一個序列化列中存儲多個選項。如果您嘗試爲其中一個選項設置文本字段,表單構建器會投訴。你可以使用attr_accessor來僞裝它,然後在更新操作中將它保存在序列化列中。

12

Rails模型只是繼承自ActiveRecord::Base的ruby類。 ActiveRecord使用attr_accessor s爲引用ruby類表的列名定義getter和setter。重要的是要注意,這只是爲了持久;模型仍然只是紅寶石類。

attr_accessor :foo是簡單地爲以下的快捷方式:

def foo=(var) 
    @foo = var 
end 

def foo 
    @foo 
end 

attr_reader :foo是簡單地爲以下的快捷方式:

def foo 
    @foo 
end 

attr_writer :foo是以下快捷方式:

def foo=(var) 
    @foo = var 
end 

attr_accessor是一個舒爾對於獲取器和設置器的tcut,而attr_reader獲取器attr_writer的快捷鍵是僅用於設置器的快捷鍵。

在rails中,ActiveRecord以一種方便的方式使用這些getter和setter來讀寫數據庫的值。但是,數據庫只是持久層。您應該可以像使用任何其他ruby類一樣自由地使用attr_accessorattr_reader來正確組合業務邏輯。由於您需要在您需要保留到數據庫的位置以外獲取和設置對象的屬性,因此請使用attr_

更多信息:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

What is attr_accessor in Ruby?

+0

'attr_reader:foo'生成' foo' getter方法,'attr_writer:foo'生成'foo ='setter方法,'attr_accessor:foo'生成'foo'和'foo ='方法。 – Fatih 2013-10-07 20:10:43

+0

+1法提赫。感謝您的編輯。我編輯了我的回覆以包含您的評論 – brycemcd 2013-10-10 20:52:40

相關問題