Требуются определенные параметры на определенные действия - PullRequest
0 голосов
/ 31 января 2019

У меня есть требование проверять наличие некоторых параметров в определенных ситуациях.Вот пример этого:

В моем пользовательском контроллере для действия обновления мне необходимо проверить наличие этих параметров.То же самое относится и к контроллеру автомобиля, обновите действие, вы можете увидеть повторяющуюся тему здесь.Параметры: additional_info.

Мой базовый контроллер предоставляет additional_info_params, который извлекает правильные данные из запроса.

Вот то, что я пробовал до сих пор.Я создал объект контроллера AR и включил его в контроллер, вот некоторый код:

module ClassMethods
  def require_additional_info_for(*methods)
    binding.pry
    return unless methods.include?(action_name)
    if additional_info_params.empty?
      head 400
    end
  end
end

Моя идея состояла в том, чтобы иметь возможность определять методы, которые требуют эти параметры в верхней части файла контроллера, как before_action от рельсов или skip_authorization_check от канкан.Вот так:

MyController < BaseController
  include Concerns::AdditionalInformation
  require_additional_info_for :update

  def update
    ...
  end
end

Однако приведенный выше код работает не так, как я планировал, главным образом потому, что он запускает класс запроса без особых знаний о запросе (где мне нужно получить имя действия через action_name).

Так как я могу сделать что-то подобное?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы также можете посмотреть на создание этих регулярных сильных параметров в соответствующем контроллере.Выглядит это примерно так:

def update_params
  params.require(:car).permit(:engine, :wheels, :rims).tap do |car_params|
    car_params.require(:engine)
  end
end

Это будет означать :car ключевые параметры верхнего уровня (которые он удаляет), и потребуется :engine параметр, но разрешить другие 2 (:wheels:rims).Если :engine отсутствует, то будет увеличено значение ActionController::ParameterMissing (точно так же, как если бы :cars отсутствовало)

Это прямо из контроллера действий.пример внизу)

Иногда я буду выбрасывать их в отдельные приватные методы на соответствующем контроллере, поэтому возможно будет также метод create_params с другими требованиями.Я предпочитаю этот метод, чем использование собственного метода в качестве before_action.

0 голосов
/ 31 января 2019

Да, вы можете, но я предлагаю вам использовать обратный вызов before_action!

В «абстрактном» контроллере зарегистрируйте свой метод следующим образом:

 class SameController < ApplicationController
   ...
   protected
     def require_additional_params
       render status: :unprocessable_entity if additional_info_params.empty?
     end
 end

После этоговсе контроллеры, которые будут использовать этот метод, должны расширять SameController и выполнять before_action, передавая вышеуказанный метод для требуемых действий, например:

class UserController < SameController
  before_action :require_additional_params, only: [:action1, :action2]
end

Примечание :Вы можете поместить require_additional_params в модуль и включить в свой контроллер, или просто поместить его в ApplicationController

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