Существует несколько способов сделать то, что вы хотите:
- Вариант 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 может быть обобщен и служить примером для отдельных частей кода контроллера, например, для извлечения записей из БД, выполнения определенных действий (например, перенаправления, если пользователь не является администратором) и т. Д. Вы можете создать папку
lib/controllers/
содержат все общие фрагменты кода ваших контроллеров (если это так, не забудьте переименовать ваш модуль в Controllers::CleanUserColumnsAfterAction
в определении модуля + include
).
- опции # 2 включают файл, определенный в lib /, который не перезагружается, как другие файлы вашей среды разработки. Это означает, что перед тестированием нового кода в вашем приложении вам необходимо перезагрузить сервер.
Благодарим за подробный ответ! Так много еще, чтобы узнать ... –
Я только обойдусь, чтобы использовать этот код при использовании опции №2. К сожалению, я получаю эту ошибку: uninitialized constant Users :: SessionsController –
, из какой строки из этого файла происходит эта ошибка? – MrYoshiji