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