Je travaille sur une application avec un contrôleur qui a beaucoup de before_actions. La plupart d'entre eux sont connectés les uns aux autres par les variables d'instance qu'ils définissent. Par exemple:
def first_action
@first_variable = Something.new
end
def second_action
if @first_variable
@second_variable = Other.new
end
end
Le contrôleur ressemble à ceci:
class ExampleController < ApplicationController
before_action :first_action, only: [:index, :show, :create]
before_action :second_action, only: [:index, :show, :create]
before_action :third_action, only: [:index, :show, :create]
before_action :fourth_action, only: [:index, :show, :create]
before_action :fifth_action, only: [:index, :show, :create]
before_action :sixth_action, only: [:index, :show, :create]
before_action :seventh_action, only: [:index, :show, :create]
def index
# some code
end
def show
# some code
end
def create
# some code
end
private
# all of the before_action methods
end
C'est vraiment difficile à comprendre de mon point de vue. Chacune de ces méthodes a beaucoup de code. De plus, il existe des contrôleurs qui héritent de celui-ci et utilisent également une partie ou la totalité de ces actions.
J'ai entendu dire qu'il vaut mieux être explicite sur les variables chargées dans chaque méthode, mais ceci:
class ExampleController < ApplicationController
def index
first_action
second_action
third_action
fourth_action
fifth_action
sixth_action
seventh_action
# some code
end
def show
first_action
second_action
third_action
fourth_action
fifth_action
sixth_action
seventh_action
# some code
end
def create
first_action
second_action
third_action
fourth_action
fifth_action
sixth_action
seventh_action
# some code
end
private
# all of the before_action methods
end
n'a pas l'air beaucoup mieux. Existe-t-il un moyen de le refactoriser pour plus de lisibilité ou dois-je m'en tenir à la solution actuelle?
Il n'y a rien de mal à avoir plusieurs actions before_actions - mais il semble plus que vous ayez un cas où elles pourraient être collectées en une seule action?
Votre solution actuelle est correcte. Vous pouvez utiliser comme pour éviter plusieurs appels de méthode
before_action :first_action, :second_action, :third_action, :fourth_action, :fifth_action, :sixth_action, :seventh_action, only: [:index, :show, :create]