2016-08-10 1 views
1

を使用して疑問符を持つメソッドを書くことができます。そして、私は次のようadmin?またはnormal?のようなメソッドを定義するためにループを作る:は、どのように私は多くの種類(管理者、通常、..)を持つユーザモデルを持っているdefine_method

class User 
    TYPES = %w(admin normal) 
    User::TYPES.each do |roleVal| 
    define_method(roleVal.to_sym) { self.role == roleVal } 
    end 
end 

上記のコードは、たとえばUser.first.adminのために働いている、しかし、私はUser.first.admin?としてそれを呼び出す必要があります。

疑問符付きdefine_methodの構文は何ですか? define_methodを使用してもそれができない場合は、メタプログラミングで疑問符を含むメソッドを作成するにはどうすればよいですか?

答えて

5

はこれです:

define_method("#{roleVal}?") { ... } 
3

それはdefine_methodでこのような方法を定義するために非常に簡単です。疑問符で終わる記号や文字列を渡すだけで十分です。何をしたい

define_method(:admin?) do 
    # code 
end 
+0

はええ、それは、少し不明だ[ 'define_method'](HTTPのためのマニュアルに従って理由://ルビー-docの.org/core-2.2.0/Module.html#method-i-define_method)では、引数としてシンボルを使用します。 –

+0

真。しかし、シンボルは '? 'で終わることもあります。 –

+1

@Зелёныйはい、厳密に必要でないところでは、ドキュメントでシンボルを使用することがあります。 'define_method'のCコードを見ると、名前に' rb_to_id'が呼び出され、文字列、フィックスナム、シンボルがMRIの 'ID'型に変換されます。最後に 'ID2SYM(id)'が呼び出され、 'ID'値をRubyシンボル(' define_methodod'の戻り値)に変換します。 –

1

あなたが以下のように行うことができます。

class User 
    TYPES = %w(admin normal) 
    User::TYPES.each do |roleVal| 
    define_method("#{roleVal}?") do self.role == roleVal end 
    end 
end 

希望すると、これが役に立ちます。

+0

ここで 'to_sym'が必要なのはなぜですか? –

+0

が削除されました.... –

+0

しかし、それは@Michael Kohlと同じ答えです、何がポイントですか? –

2

シンボル内の疑問符終了で特別なことは何もありません:

class User 
    TYPES = %i(admin? normal?) 
    User::TYPES.each do |roleVal| 
    define_method(roleVal) { self.role == roleVal.to_s[0...-1] } 
    end 
end 
関連する問題