ruby
У Ruby on Rails, колбеки (callbacks) — це потужний інструмент для виконання конкретних методів на різних етапах життєвого циклу запиту. Один із найпоширеніших колбеків — це before_action, який дозволяє виконати метод до виконання певних дій контролера. У цій статті ми розглянемо різні опції, доступні для before_action, такі як only, except, if, unless і prepend, та як вони можуть покращити ваш код.
Що таке before_action?
Колбек before_action — це функція в контролерах Rails, яка дозволяє розробникам виконувати метод перед вказаними діями. Наприклад:
class ArticlesController < ApplicationController
before_action :authenticate_user
def index
# Код для списку статей
end
def show
# Код для перегляду статті
end
end
У наведеному прикладі метод authenticate_user виконується перед діями index і show.
Опції для before_action
Rails надає кілька опцій для управління тим, як і коли застосовується колбек. До цих опцій входять only, except, if, unless і prepend. Давайте розглянемо кожну з них.
1. only
Опція only вказує, які саме дії мають викликати колбек. Це корисно, коли ви хочете, щоб колбек застосовувався лише до обмеженого набору дій.
class ArticlesController < ApplicationController
before_action :authenticate_user, only: [:edit, :update]
def edit
# Код для редагування статті
end
def update
# Код для оновлення статті
end
def index
# Тут автентифікація не потрібна
end
end
У цьому прикладі, authenticate_user буде виконано тільки перед діями edit і update.
2. except
Опція except дозволяє виключити конкретні дії з виклику колбека.
class ArticlesController < ApplicationController
before_action :authenticate_user, except: [:index, :show]
def index
# Код для списку статей
end
def show
# Код для перегляду статті
end
def edit
# Потрібна автентифікація
end
end
Тут метод authenticate_user виконується перед усіма діями, окрім index та show.
3. if
Опція if приймає метод, блок або лямбду, яка визначає, чи має виконуватись колбек. Якщо умова оцінюється як true, колбек виконується.
class ArticlesController < ApplicationController
before_action :authenticate_user, if: -> { current_user.admin? }
def destroy
# Код для видалення статті
end
end
У цьому випадку, authenticate_user виконується тільки якщо поточний користувач — адміністратор.
4. unless
Опція unless є протилежністю if. Колбек виконується тільки, якщо умова оцінюється як false.
class ArticlesController < ApplicationController
before_action :authenticate_user, unless: -> { Rails.env.test? }
def create
# Код для створення статті
end
end
Тут метод authenticate_user не виконується в тестовому середовищі.
5. prepend
За замовчуванням, колбеки додаються в кінець ланцюга колбеків, тобто вони виконуються після будь-яких раніше визначених колбеків. Опція prepend забезпечує додавання колбека на початок ланцюга, що дозволяє виконувати його першим.
class ArticlesController < ApplicationController
before_action :track_action
before_action :authenticate_user, prepend: true
def show
# Код для перегляду статті
end
end
У цьому прикладі, authenticate_user виконується перед track_action, навіть якщо він визначений пізніше в коді.
Комбінування опцій
Ви можете комбінувати кілька опцій, щоб створити складні умови для ваших колбеків.
ruby
Наприклад:
class ArticlesController < ApplicationController
before_action :authenticate_user, only: [:edit, :update], if: -> { current_user.present? }
def edit
# Код для редагування статті
end
def update
# Код для оновлення статті
end
end
Тут authenticate_user буде виконано лише для дій edit і update, і тільки якщо користувач увійшов у систему.
Висновок
Колбек before_action в Rails — це універсальний інструмент для контролю потоку логіки вашого застосунку. Використовуючи опції, такі як only, except, if, unless і prepend, ви можете забезпечити точне застосування колбеків саме там, де це необхідно, що призведе до більш чистого та легкого для підтримки коду. Експериментуйте з цими опціями, щоб оптимізувати ваші контролери та покращити ваші Rails-застосунки.
Перекладено з: A Simple Guide to before_action Callbacks in Ruby on Rails