0

我有以下语句,虽然它使用 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 的方法?

4

2 回答 2

4

改用Object#send,在你固定资源名称后:http ://ruby-doc.org/core-1.9.3/Object.html#method-i-send

于 2012-07-28T13:37:13.040 回答
2

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

Object.const_get(resource_name)

如果您使用的是 Rails,您还可以使用constantizewhich 具有理解以下内容的优势Module::SomeClass

于 2012-07-28T13:36:22.443 回答