Pracuję nad aplikacją z kontrolerem, który ma wiele elementów before_actions. Większość z nich jest połączona ze sobą za pomocą ustawionych przez siebie zmiennych instancji. Na przykład:Czy wiele odwołań before_action wywołuje zły styl kodu?
def first_action
@first_variable = Something.new
end
def second_action
if @first_variable
@second_variable = Other.new
end
end
Kontroler wygląda następująco:
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
To naprawdę trudno zrozumieć z punktu widzenia kopalni. Każda z tych metod zawiera dużo kodu. Dodatkowo istnieją kontrolery, które dziedziczą z tego, a także używają części lub wszystkich tych działań.
Słyszałem, że lepiej jest być jawne o załadowanych zmiennych w każdej metodzie, ale w ten sposób:
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
nie wygląda dużo lepiej. Czy istnieje sposób na refaktoryzację w celu uzyskania większej czytelności, czy powinienem trzymać się obecnego rozwiązania?
Nie ma nic złego w posiadaniu wielu 'before_actions' - ale wygląda na to, że masz przypadek, w którym można je zebrać w jedną akcję? – Matt
Poszedłem z twoim pomysłem @Matt Dzięki i jeśli dodasz go jako odpowiedź, mogę to sprawdzić jako rozwiązanie mojego problemu :) – zeth
Zrobione, cieszę się, że to pomogło! – Matt