所以我正在开发一个大型项目。有很多类使用before_filter来设置@current_user变量(实际上有大量的这些before_filter方法用于其他变量,但我用这个作为示例):
before_filter :current_user
调用应用程序控制器的current_user方法:
class ApplicationController < ActionController::Base
def current_user
@current_user ||= session[:user_id].present? ? User.includes(:memberships).find(session[:user_id]) : nil
end
另一个选择是使用application_controller辅助方法:
class ApplicationController < ActionController::Base
helper_method :get_current_user
def get_current_user
@current_user ||= session[:user_id].present? ? User.includes(:memberships).find(session[:user_id]) : nil
end
然后我通过调用helper方法替换app中的所有@current_user引用:
get_current_user
这确保只在方法或视图中调用方法,对吧?使用before_filter是否有性能优势?
答案 0 :(得分:1)
在你的情况下,两者的行为方式相同,并且在得到的结果中相同 - 缓存实例变量@current_user
。
将控制器方法声明为帮助器。例如,以下内容 生成current_user和logged_in?可用的控制器方法 视图
before_action
(因为before_filter
已被弃用):
在操作
之前附加回调
由于使用了memoization,结果在两种情况下都相同。
不同之处在于,before_action
每次调用任何操作时都会调用方法,而helper_method
只是为您提供帮助。如果在两者中执行的逻辑更复杂,确实会有性能差异 - before_action
会消耗更多资源。
P.S。有两件事是不同的,它的用途是不同的,你无法真正比较它们。