2017-01-31 4 views
-1

attr_accessorメソッドを使用して動的にセッターメソッドを作成するときに値を設定する方が良いですか?レールの別のモデルからそれらの値を設定するには、これが必要です。私は以下のようなことをしようとしています。ルーターでattr_accessorを使用してセッターメソッドを生成するときに動的な値を設定する

Model_class.all.each do |mdl| 
    attr_accessor(mdl.some_field) 
end 

次に、getメソッドとsetterメソッドが作成されていることがわかりました。私がしたいことは、これらのメソッドが作成されるときに、私はsetterメソッドに指定する値を欲しいということです。事前に感謝します。

+0

私はあなたが求めているのか分からないが、私の直感は、あなたがしていることを言いますデリゲートメソッドを探している - http://apidock.com/rails/Module/delegate – marmeladze

+0

何よりも良い? – sawa

答えて

2

attr_accessorには魔法が埋め込まれていません。それに渡されたのparamsのそれぞれについて、それは基本的にのようなもの(コードが簡素化され、など必要なチェックを欠いている)を実行する:

def attr_accessor(*vars) 
    vars.each do |var| 
    define_method var { instance_variable_get("@#{var}") } 
    define_method "#{var}=" { |val| instance_variable_set("@#{var}", val) } 
    end 
end 

述べ、attr_accessor :var1, :var2 DSLは、単に新しい4つの昔ながらの良いルビー方法をもたらします。あなたが求めているところでは、これらのメソッド(またはそれらのうちのいくつか、またはそれらのどれか)の定義に注意を払うかもしれません。上記のいつものように呼ばれている

attr_reader :variable # reader is reader, no magic 

def variable=(val) do 
    raise ArgumentError, "You must be kidding" if val.nil? 
    @variable = val 
end 

:たとえば、1が行う可能性がありますチェックして面倒な設定のため

instance.variable = 42 
#⇒ 42 
instance.variable = nil 
#⇒ ArgumentError: You must be kidding 
関連する問題