Railsでオブジェクトの仮想属性tag_listを作成するためにattr_accessor:tag_listを記述できることはわかっています。これにより、オブジェクトのフォームにtag_list属性を含めることができます。
Attr_accessor:tag_listを使用する場合、モデルでtag_listに対してアクションを実行して、フォームからデータをプルおよび操作できます。
私が知りたいのは、attr_accessorの代わりに、attr_accessorのデフォルト機能を完全に複製するゲッターとセッターをどのように書くかです。例えば:
def tag_list
#what goes here
end
参考までに
def tag_list
@tag_list
end
これは動作しません。
attr_accessor
は組み込みのRubyメソッドであり、コンテキストActiveRecordで特別な意味はありません。attr_accessor :tag_list
は基本的にこのコードと同等です:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
ただし、ActiveRecordモデルでは、次のようなものが必要になる場合があります。
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
若干の違いがあります。最初の方法では、obj[:tag_list]
はゲッターおよびセッターと同じストレージを使用しません。後者では、そうです。
Rubyでは、次の2行のコードは同等です。
thing.blabla
thing.blabla()
どちらもオブジェクトblabla
のメソッドthing
を呼び出し、そのメソッド内で評価された最後の式に評価します。つまり、上記のgetterメソッドの場合、return
ステートメントも必要ありません。メソッドがメソッドの最後の式(@tag_list
、インスタンス変数の値)を返すだけだからです。 )。
また、これらの2行のコードは同等です。
thing.blabla=("abc")
thing.blabla = "abc"
どちらもオブジェクトthing
のメソッドblabla=
を呼び出します。 =
文字を含む特別な名前は、他のメソッド名と同様に使用できます。
attributesは時々呼び出されるため、実際にはプレーンなメソッドであるという事実は、返すか受け入れる前に値に変換されたいくつかの特別なロジックを使用することもできますそれら。例:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end
ActiveRecordを使用する場合、これは同等のゲッターバージョンとセッターバージョンです。
def tag_list
read_attribute(:tag_list)
end
def tag_list=(val)
write_attribute(:tag_list, val)
end
これはあなたが探していたものですか?
Notice the code below is in the [Helpers] path. Helpers are now included for
all [Controllers] to work from when instantiated.
module SettergettersHelper
#TODO Wayne
mattr_accessor :nameport
#TODO Wayne Mattingly the code below was replaced BY ABOVE
#TODO and not depricatable Rails 4.2.3
# def nameport
# @nameport
# end
# def nameport=(nameport)
# @nameport = nameport
#end
end
*Getter from Accounts Controller:*
def index
@portfolio_name = nameport
end
*Setter from Portfolio Controller:*
def show
@portfolio_name = @portfolio_name.portfolio_name #from database call
SettergettersHelper.nameport = @portfolio_name # set attribute
end