如何使用define_method编写带问号的方法

时间:2016-08-10 12:36:57

标签: ruby-on-rails ruby metaprogramming

我的用户模型有很多类型(admin,normal,..)。我创建循环以定义admin?normal?等方法,如下所示:

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无法实现,那么如何在元编程中创建带问号的方法?

4 个答案:

答案 0 :(得分:5)

你想要的是这个:

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

答案 1 :(得分:3)

使用define_method定义此类方法非常简单。它足以传递以问号结尾的符号或字符串。

define_method(:admin?) do
  # code
end

答案 2 :(得分:2)

符号中的结束问号没有什么特别之处:

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

答案 3 :(得分:1)

你可以这样做。

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

希望,这会对你有帮助。