【问题标题】:Rails best practice: use before_filter or application_controller helper method?Rails 最佳实践:使用 before_filter 或 application_controller 辅助方法?
【发布时间】:2016-11-07 16:52:38
【问题描述】:

所以我正在做一个大型的 Rails 项目。有很多类使用 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

然后我将应用程序中的所有@current_user 引用替换为对辅助方法的调用:

get_current_user

这确保该方法只在需要它的方法或视图中被调用,对吗?使用 before_filter 是否有性能优势?

【问题讨论】:

  • 没有必要称它为get_current_user。在典型的 Ruby 代码中,get_ 部分是多余的。这里唯一的区别是你强制加载它,这违背了延迟加载的目的。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

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

helper_method:

将控制器方法声明为助手。例如,以下 使 current_user 和 logged_in?控制器方法可用于 视图

before_action(因为 before_filter 已弃用):

在操作之前添加回调

由于使用了记忆,所以两种情况下的结果是相同的。

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

附:两件事不同,它的用途不同,你无法真正比​​较它们。

【讨论】:

  • 好的,这很有帮助。我没有编写应用程序,并且有大量不同的控制器调用这些调用(其中一些是通过使用'except'或'only'限定 before_filter 来过滤的)。所以它只是让我使用 DRYer 方法,在需要时调用它,而不是添加可能需要也可能不需要的 before_action 方法。有没有办法保留 @current_user 实例变量但将其绑定到 application_controller 方法,以便仅在需要时实例化它?
  • @yeldarb 当然,只需将您的helper_method 移动到application_controller.rb,它将在所有控制器中可用
猜你喜欢
  • 2016-06-22
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多