您何時在Rails模型中使用attr_reader
/attr_writer
/attr_accessor
?attr_accessor在Rails中的用法
回答
attr_accessor可用於您不想直接存儲在數據庫中的值,並且只存在於對象的生命週期(例如密碼)中。
attr_reader可以作爲幾種選擇之一,做這樣的事情:
def instance_value
"my value"
end
永遠不要,除非你有特殊的需要。自動數據庫支持的訪問器爲您創建,所以您不必擔心。
任何你創建的attr_accessor
都會改變rails對象上的相關@attr
,但是當對象被銷燬的時候這個對象會丟失,除非你把它粘回到數據庫中。有時你確實需要這種行爲,但在Rails應用程序中這是不尋常的。
現在在紅寶石中,這是一個不同的故事,你最終會頻繁使用它們。但是如果你需要他們的話,我會很驚訝 - 尤其是最初。
完美 - 謝謝。 (我會加上投票你,但我剛剛在這裏,我似乎首先需要15pts ...該機制似乎對新用戶不友好。) – Ethan 2010-05-08 21:57:38
注意:從Rails 3.x開始attr_accessible是必需的默認情況下)爲每個模型的屬性,你想允許寫入(例如通過表單POST)。爲了向後兼容,這可以在'application.rb'中修改,但是作爲一個安全措施被添加,要求你明確地將用戶可更新的屬性列入白名單。作爲一個附加的好處,模型中的所有屬性(db列)都可以在模型中看到,因此您不必記住該列的命名方式:-) – 2012-06-29 15:25:26
如果您正在使用它來驗證接受TERMS_OF_SERVICE的,你真的應該考慮使用只會驗證:TERMS_OF_SERVICE,:驗收=> true。它會創建一個虛擬屬性,並且更加簡潔。
http://guides.rubyonrails.org/active_record_validations.html#acceptance。
一個示例是在一個序列化列中存儲多個選項。如果您嘗試爲其中一個選項設置文本字段,表單構建器會投訴。你可以使用attr_accessor來僞裝它,然後在更新操作中將它保存在序列化列中。
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_accessor
和attr_reader
來正確組合業務邏輯。由於您需要在您需要保留到數據庫的位置以外獲取和設置對象的屬性,因此請使用attr_
。
更多信息:
http://apidock.com/ruby/Module/attr_accessor
- 1. 在rails中使用attr_accessor 3
- 2. 在rails中的attr_accessor問題
- 3. 在Rails中使用燈具分配attr_accessor
- 4. 如何使用`attribute_names`方法在rails模型中訪問attr_accessor
- 5. 爲什麼在Rails中需要attr_accessor?
- 6. Rails:未定義的方法錯誤無法用attr_accessor修復
- 7. Ruby on Rails:用於子模型的attr_accessor
- 8. Rails觸摸並返回attr_accessor
- 9. 試圖在模型中使用attr_accessor值的Rails 5
- 10. 在試圖跳過驗證的rails中使用attr_accessor
- 11. 如何Ruby on Rails中attr_accessor工作
- 12. attr_accessor中的method_missing
- 13. attr_accessor在accept_nested_attributes_for中無法訪問
- 14. 用父類的子方法調用attr_accessor
- 15. 非模型數組元素的Rails attr_accessor
- 16. 如何讓attr_accessor真的在rails中工作?
- 17. Rails 5:attr_accessor拋出NoMethodError(未定義的方法'keys'爲nil:NilClass):
- 18. Rails模型attr_accessor屬性沒有保存?
- 19. Ruby的attr_accessor魔法定義方法
- 20. Ruby對象/方法/ attr_accessor使用
- 21. Attr_accessor使用表名
- 22. Rails的小兒可用父模型attr_accessor屬性
- 23. Rails中的非數據庫attr_accessor屬性持久性
- 24. 打通`attr_accessor`沒有覆蓋中定義的所有變量`attr_accessor`
- 25. 使用attr_accessor進行條件驗證使用attr_accessor
- 26. 未定義的方法和attr_accessor
- 27. 無法訪問attr_accessor定義的變量
- 28. Rails 3.2.8 attr_accessor看起來並沒有使用form_tag
- 29. 指定屬性列表中attr_accessor與方法調用
- 30. 從類內部使用attr_accessor?
我猜你的意思是attr_accessor? – 2010-05-08 05:58:52
啊對。謝謝。 – Ethan 2010-05-08 21:53:34