Rails最佳实践:使用before_filter或application_controller帮助方法?

时间:2016-11-07 16:52:38

标签: ruby-on-rails ruby activerecord

所以我正在开发一个大型项目。有很多类使用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是否有性能优势?

1 个答案:

答案 0 :(得分:1)

在你的情况下,两者的行为方式相同,并且在得到的结果中相同 - 缓存实例变量@current_user

helper_method

  

将控制器方法声明为帮助器。例如,以下内容   生成current_user和logged_in?可用的控制器方法   视图

before_action(因为before_filter已被弃用):

  

在操作

之前附加回调

由于使用了memoization,结果在两种情况下都相同。

不同之处在于,before_action每次调用任何操作时都会调用方法,而helper_method只是为您提供帮助。如果在两者中执行的逻辑更复杂,确实会有性能差异 - before_action会消耗更多资源。

P.S。有两件事是不同的,它的用途是不同的,你无法真正比​​较它们。