Ruby on rails Rails最佳实践:使用before\u过滤器或application\u控制器助手方法?

Ruby on rails Rails最佳实践:使用before\u过滤器或application\u控制器助手方法?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,所以我在做一个大型rails项目。有很多类使用before_filter来设置@current_用户变量(实际上,对于其他变量,有很多before_filter方法,但我以这个为例): 它调用应用程序控制器的当前用户方法: class ApplicationController < ActionController::Base def current_user @current_user ||= session[:user_id].present? ? User.

所以我在做一个大型rails项目。有很多类使用before_filter来设置@current_用户变量(实际上,对于其他变量,有很多before_filter方法,但我以这个为例):

它调用应用程序控制器的当前用户方法:

class ApplicationController < ActionController::Base

    def current_user
        @current_user ||= session[:user_id].present? ? User.includes(:memberships).find(session[:user_id]) : nil
    end
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
get_current_user

这确保了只在需要的方法或视图中调用该方法,对吗?使用before_过滤器是否有性能优势?

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

:

将控制器方法声明为帮助器。例如,以下 是否使用当前用户并登录?控制器方法可用于 景色

(因为不推荐使用过滤器之前的
):

在操作之前追加回调

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

不同之处在于,使用
before\u action
时,每次调用任何操作时实际上都在调用该方法,而
helper\u method
只为您提供一个助手。如果在这两种情况下执行的逻辑更复杂,那么确实会有性能差异-
在执行操作之前
会消耗更多的资源


另外,两件事是不同的,它的用途不同,你无法真正比较它们。

好的,这很有帮助。我没有编写这个应用程序,有很多这样的调用需要很多不同的控制器(其中一些是通过使用'except'或'only'限定before_过滤器来过滤的)。因此,我只需要使用helper方法,它在需要时被调用,而不是添加before_action方法,它可能需要也可能不需要。有没有办法保留@current\u user instance变量,但将其绑定到应用程序\u控制器方法,以便仅在需要时对其进行实例化?@yeldarb当然,只需将您的
helper\u方法
移动到
application\u controller.rb
即可在所有控制器中使用,无需调用
get\u current\u user
。在典型的Ruby代码中,
get\uu
部分是冗余的。这里唯一的区别是强制加载,这与延迟加载的目的背道而驰。
get_current_user