2016-02-23 3 views
3

После входа в систему у меня есть SessionController, который запускает after_action для сброса определенных столбцов пользователя. В другом контроллере я хочу сделать то же after_action для создания и обновления.Rails - вызов такого же метода after_action из разных контроллеров

Достаточно просто скопировать и вставить тот же код в оба контроллера, но я знаю, что в один прекрасный день я сделаю изменения в одном контроллере и забуду обновить другой.

Можно ли вызвать тот же метод, что и after_action с разных контроллеров?

ответ

7

Существует несколько способов сделать то, что вы хотите:

  • Вариант 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 /, который не перезагружается, как другие файлы вашей среды разработки. Это означает, что перед тестированием нового кода в вашем приложении вам необходимо перезагрузить сервер.
+0

Благодарим за подробный ответ! Так много еще, чтобы узнать ... –

+0

Я только обойдусь, чтобы использовать этот код при использовании опции №2. К сожалению, я получаю эту ошибку: uninitialized constant Users :: SessionsController –

+0

, из какой строки из этого файла происходит эта ошибка? – MrYoshiji

Смежные вопросы