web-dev-qa-db-ja.com

デフォルトのゲッターとセッターはレールでどのように見えますか?

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

これは動作しません。

24
jay

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
66
Niklas B.

ActiveRecordを使用する場合、これは同等のゲッターバージョンとセッターバージョンです。

def tag_list
  read_attribute(:tag_list)
end

def tag_list=(val)
  write_attribute(:tag_list, val)
end

これはあなたが探していたものですか?

9
leonardoborges
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
0
user3487016