2016-11-07 38 views
1

所以我工作的一大Rails项目。有为数众多的使用的before_filter设置@current_user变量类(其实有一吨的这些的before_filter其他变量的方法,但是我用这一个为例):Rails最佳实践:使用before_filter或application_controller辅助方法?

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 helper方法:

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 

然后我全部更换在应用程序与到辅助方法的调用@current_user引用:

get_current_user 

这保证了方法仅被调用的方法或在需要的地方的意见,对不对?使用before_filter有没有性能优势?

+0

没有必要把它称为'get_current_user'。在典型的Ruby代码中,'get_'部分是多余的。这里唯一的区别是你正在强制加载它,这种方式打败了懒加载的目的。 – tadman

回答

1

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

helper_method

声明一个控制器方法作为辅助。例如,下面的 使得CURRENT_USER和LOGGED_IN?提供给 视图控制器方法

before_action(因为before_filter已弃用):

追加前行动

由于记忆化的回调被使用的结果是在两种情况下相同。

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

P.S.两件事情不同,它的用途是不同的,你不能真正地比较它们。

+0

好的,这很有帮助。我没有编写应用程序,并且有很多不同的控制器需要TON(其中一些通过使用'except'或'only'限定before_filter来过滤)。所以它只是接缝机给我使用的辅助方法,必要时调用,而不是添加before_action方法,这可能会或可能不会需要。有没有办法保持@current_user实例变量,但将其绑定到application_controller方法,以便它只在需要时才实例化? –

+0

@yeldarb当然,只需将'helper_method'移动到'application_controller.rb',它就可以在所有的控制器中使用 –