【问题标题】:Rails - Call same after_action method from different controllersRails - 从不同的控制器调用相同的 after_action 方法
【发布时间】:2016-02-23 21:54:22
【问题描述】:

登录后,我让我的 SessionsController 运行 after_action 来重置某些用户列。在另一个控制器中,我想在创建和更新时执行相同的 after_action。

只需将相同的代码复制并粘贴到两个控制器中就很容易了,但我知道有一天我会在一个控制器中进行更改而忘记更新另一个控制器。

有没有办法从不同的控制器调用与 after_action 相同的方法?

【问题讨论】:

    标签: ruby-on-rails callback controllers


    【解决方案1】:

    有几种方法可以做你想做的事:

    • 选项 1:在 ApplicationController 中定义一个方法并使用 after_action 回调调用此方法
    • 选项 2:在您的 lib/ 文件夹中定义一个模块,将其包含在控制器中并在 after_action 回调中调用其方法
    • 可能还有其他选择

    选项 1:ApplicationController 中的方法

    实施:

    class ApplicationController < ActionController::Base
      # ...
    
      def clean_user_columns
        raise 'No user connected!' unless current_user.present?
        do_some_stuff
      end
    

    用法:

    class SessionsController < ApplicationController
      after_action :clean_user_columns
    

    选项 2:控制器中包含的模块

    实施:

    # file created here: /lib/clean_user_columns_after_action.rb
    # you will need to restart your server to see the changes of this file
    module CleanUserColumnsAfterAction
      def clean_user_columns
        do_some_stuff
      end
    end
    

    用法:

    class SessionController < ApplicationController
      include CleanUserColumnsAfterAction
      after_action :clean_user_columns
    

    结论:在我看来,选项#2是可行的方法:

    • 选项 #1 涉及您的 clean_user_columns 可用于您应用程序的每个控制器,但它只会在调用时使用。与选项 #2 相比,它为您节省了一行代码,即 include CleanCleanUserColumnsAfterAction 行。
    • 选项 #2 让您将模块包含在您想要使用它的位置,而不是提供给应用程序的每个控制器。
    • 选项 #2 可以通用化,并作为多个控制器共享代码片段的示例,例如从数据库中检索记录、执行特定操作(例如,如果用户不是管理员则重定向)等。您可以创建一个文件夹 @987654329 @ 包含控制器的所有共享代码(如果是这样,请不要忘记在模块定义中将模块重命名为 Controllers::CleanUserColumnsAfterAction + include 语句)。
    • 选项 #2 涉及在 lib/ 中定义的文件,该文件不会像其他文件一样由您的开发环境重新加载。这意味着在您的应用上测试新代码之前,您需要重新启动服务器。

    【讨论】:

    • 我刚刚开始使用选项 #2 将此代码放入其中。不幸的是,我收到了这个错误:未初始化的常量 Users::SessionsController
    • 这个错误来自哪个文件的哪一行?
    • app/controllers/users/sessions_controller.rb:2:in &lt;class:SessionsController&gt;' app/controllers/users/sessions_controller.rb:1:in '
    • 你的文件app/controllers/users/sessions_controller.rb定义了Users::SessionsController类吗?
    • 我没有将 lib 文件夹添加到我的自动加载路径中:stackoverflow.com/questions/17007685/…
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多