Ruby on rails Rails-从不同的控制器调用相同的after_action方法

Ruby on rails Rails-从不同的控制器调用相同的after_action方法,ruby-on-rails,callback,controllers,Ruby On Rails,Callback,Controllers,登录后,我让SessionController运行after_操作来重置某些用户列。在另一个控制器中,我希望在创建和更新上执行相同的后续操作 只需将相同的代码复制并粘贴到两个控制器中就足够容易了,但我知道总有一天我会在一个控制器中进行更改,而忘记更新另一个控制器 有没有办法从不同的控制器调用与后处理相同的方法?有几种方法可以完成您想要的操作: 选项1:在ApplicationController中定义一个方法,并使用after\u action回调调用此方法 选项2:在lib/文件夹中定义一个

登录后,我让SessionController运行after_操作来重置某些用户列。在另一个控制器中,我希望在创建和更新上执行相同的后续操作

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


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

有几种方法可以完成您想要的操作:

  • 选项1:在ApplicationController中定义一个方法,并使用
    after\u 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
# 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 SessionsController < ApplicationController
  after_action :clean_user_columns
class SessionController < ApplicationController
  include CleanUserColumnsAfterAction
  after_action :clean_user_columns
class SessionController

结论:在我看来,选项2是一条可行之路:

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

我刚刚开始使用选项2将此代码放入。不幸的是,我遇到了以下错误:未初始化的常量用户::会话控制器此错误来自哪个文件的哪一行?app/controllers/Users/sessions\u controller.rb:2:in
“app/controllers/Users/sessions\u controller.rb:1:in
”是您的文件
app/controllers/users/sessions\u controller.rb
定义类
users::sessioncontroller
?我没有将lib文件夹添加到自动加载路径: