web-dev-qa-db-fra.com

Les appels before_action multiples sont-ils de mauvais style de code?

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?

15
zeth

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?

6
Matt

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]
29
empr