Простий посібник по колбеках before_action у Ruby on Rails

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

Leave a Reply

Your email address will not be published. Required fields are marked *