Используйте один и тот же фильтр before_action в нескольких контроллерах - PullRequest
0 голосов
/ 21 января 2020

В приложении Rails у меня есть фильтр before_action, который отправляет сообщение webhook. Поскольку у меня есть несколько контроллеров, на которые я хочу, чтобы before_action действовал, есть ли хороший способ сделать его модулем и добавить его?

Мой текущий лог c:

# first_controller.rb:
before_action :do_something
def do_something
 #same logic
end

# second_controller.rb:
before_action :do_something
def do_something
 #same logic
end

# third_controller.rb:
before_action :do_something
def do_something
 #same logic
end

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Если ваши контроллеры наследуются от ApplicationController, вы можете сделать следующее:

class ApplicationController < ActionController::Base
  def do_something
   #same logic
  end
end

class FirstController < ApplicationController
  before_action :do_something
end
class SecondController < ApplicationController
  before_action :do_something
end
class ThirdController < ApplicationController
  before_action :do_something
end

Или вы можете создать свой собственный родительский контроллер, например. DoSomethingController

class DoSomethingController < ApplicationController
  before_action do_something

  def do_something
   #same logic
  end
end

class FirstController < DoSomethingController
end
class SecondController < DoSomethingController
end
class ThirdController < DoSomethingController
end

Или вы можете использовать ответ @ code_aks { ссылка }, чтобы создать модуль и включить его.

2 голосов
/ 21 января 2020

Да, здесь хорошо использовать DRY. Если ваши контроллеры имеют один и тот же родительский класс, вы можете разместить этот метод там. Если нет, рекомендуется перенести этот метод в модуль и включить его с повторным использованием.

1 голос
/ 21 января 2020

Вы можете попробовать написать код ниже в методах контроллера. Например:

# app/controllers/concerns/example_concern.rb
module ExampleConcern
 extend ActiveSupport::Concern

 protected
 def before_filter_1
   puts "from first before_filter_method"
 end

 def before_filter_2
   puts "from second before_filter_method"
 end
end

Теперь в контроллере включите модуль в концерн и при необходимости вызовите методы, использующие before_action. Например:

# app/controllers/examples_controller.rb
class ExamplesController < ApplicationController
  include ExampleConcern

  before_action :before_filter_1, only: [:action_a, :action_b, :action_c]
  before_action :before_filter_2, only: [:action_d, :action_e]

  def action_a
  end
  def action_b
  end
  def action_c
  end
  def action_d
  end
  def action_e
  end
end

Надеюсь, это поможет вам. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...