我有以下的聲明,不工作雖然它使用eval:紅寶石元編程替代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這樣做的更好的辦法?
我有以下的聲明,不工作雖然它使用eval:紅寶石元編程替代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這樣做的更好的辦法?
使用Object#send
相反,你constantize資源名稱後的優勢:http://ruby-doc.org/core-1.9.3/Object.html#method-i-send
如果我理解正確你想從字符串「產品」到恆Product
去,所以如果你使用的Rails你可以只使用
Object.const_get(resource_name)
,你也可以使用constantize
哪些有了解的東西就像Module::SomeClass
更好地利用'public_send',而不是'send',它可以防止你可以通過調用像'system'這樣的私有方法 – Meier 2016-04-14 21:55:05