25

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

これは動作しません。

4

3 に答える 3

69

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]は、getter および setter と同じストレージを使用しません。後者では、そうです。

ゲッター/セッターの概念の説明

Ruby では、次の 2 行のコードは同等です。

thing.blabla
thing.blabla()

blablaどちらもオブジェクトのメソッドを呼び出し、そのメソッドthing内で評価された最後の式に評価されます。returnつまり、上記の getter メソッドの場合、メソッドは単にメソッドの最後の式 (@tag_listインスタンス変数の値) を返すだけなので、ステートメントも必要ありません。

また、これらの 2 行のコードは同等です。

thing.blabla=("abc")
thing.blabla = "abc"

どちらもblabla=オブジェクトのメソッドを呼び出しますthing。文字を含む特別な名前は、=他のメソッド名と同じように使用できます。

attributesと呼ばれることもあるが、実際には単純なメソッドであるという事実により、値を返すか受け入れる前に、値に変換された特別なロジックを使用することもできます。例:

def price_in_dollar
  @price_in_euro * 0.78597815
end

def price_in_dollar=(val)
  @price_in_euro = val / 0.78597815
end
于 2012-01-08T02:09:33.110 に答える
0
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
于 2015-08-31T01:11:04.407 に答える