前面我們介紹過了 attribute
的用處,接著我們來探討一下與平常習慣的 attr_accessor
有什麼不同。
他跟 attr_accessor
不一樣的地方是,儲存變數的方式用的不是實體變數
,所以如果想在 code 裡面使用 @(attr)
去讀變數是讀不到的!
他儲存的地方在 @attributes
裡面,他是一個 ActiveModel::AttributeSet
。
他並不是單純的 hash,裡面也不是單純的 key and value,而是包含了眾多像是資料轉型前後的資訊、attr 名稱以及使用的轉換器等等。
所以要讀取或寫入這些使用 attribute
所定義的值,你必須使用他提供的 (attr)
& (attr)=
method。
For example:
class MyClass
include ActiveModel::Model
include ActiveModel::Attributes
attribute :title
def perform
p "實體變數: 『#{@title}』"
p "方法: 『#{title}』"
end
end
然後我們建一個物件,再 perform 他看看裡面的值長什麼樣子
obj = MyClass.new title: '標題唷'
obj.perform
印出如下:
"實體變數: 『』"
"方法: 『標題唷』"
可以看到實體變數的部分是沒有值的。
在享用 attribute
給你帶來的便利魔法的同時,還是要習慣一下他的特點啦。XD
我們來看一下裡面的結構,在 console 裡看起來很大一包很難看:
pp obj
#<MyClass:0x00007fc023b94b10
@attributes=
#<ActiveModel::AttributeSet:0x00007fc023b94a98
@attributes=
{"title"=>
#<ActiveModel::Attribute::FromUser:0x00007fc023b94728
@name="title",
@original_attribute=
#<ActiveModel::Attribute::WithCastValue:0x00007fc023b949d0
@name="title",
@original_attribute=nil,
@type=
#<ActiveModel::Type::Value:0x00007fc023b8f2a0
@limit=nil,
@precision=nil,
@scale=nil>,
@value_before_type_cast=nil>,
@type=
#<ActiveModel::Type::Value:0x00007fc023b8f2a0
@limit=nil,
@precision=nil,
@scale=nil>,
@value="標題唷",
@value_before_type_cast="標題唷">}>>
關於如何讓他在 console 裡看起來能好看一點,之後會講XD。