新手问题 关于 Ruby 语法里,方法当变量用的问题。

afghl · 2015年09月08日 · 最后由 hlcfan 回复于 2015年09月08日 · 1697 次阅读

比如在 application_controller 下有page_metadata方法,代码如下:

def page_metadata
  method = "#{action_name}_metadata".to_sym
  send(method) if respond_to?(method, true)
end

helper_method :page_metadata

这时可以在页面直接把page_metadata当成变量使用。 但每次用都会 run 一次这个方法。

所以问题是:如果方法有较多代码,有什么方法可以 cache 住,不多次执行呢?

例如这样:

def page_metadata
  @metadata ||= lambda {
    method = "#{params[:action]}_metadata".to_sym
    send(method) if respond_to?(method, true)
  }.call
end
helper_method :page_metadata

但看起来好像有点奇怪。比较好的做法是什么?

如果是 Rails 4,直接 try 就可以。这里并不是方法当变量用,就是方法调用。而且 Object.send 是可以接受字符串的。

def page_metadata
  @metadata ||= try("#{params[:action]}_metadata")
end
helper_method :page_metadata
需要 登录 后方可回复, 如果你还没有账号请 注册新账号