红宝石元编程替代eval

时间:2012-07-28 13:31:45

标签: ruby metaprogramming

我有以下声明,虽然它使用eval:

但它确实有效
  def resource_name
    self.class.to_s.match(/(.+)Controller/)[1].singularize
  end

  def collection
    @collection ||= eval "#{resource_name}.all(sort: [[:name, :asc]])"
  end

有没有更好的方法来做这个不使用eval?

2 个答案:

答案 0 :(得分:4)

在您对资源名称进行实例化后,请使用Object#sendhttp://ruby-doc.org/core-1.9.3/Object.html#method-i-send

答案 1 :(得分:2)

如果我理解正确,您尝试从字符串'Product'转到常量Product,那么您可以使用

Object.const_get(resource_name)

如果您正在使用Rails,您还可以使用constantize,这样可以了解Module::SomeClass

等内容