Rails - Как настроить необходимые параметры для определенных методов контроллера? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть контроллер с несколькими методами.Я хотел бы иметь возможность требовать определенные параметры для определенных маршрутов.

Я бы хотел, чтобы my_endpoint_1 не требовал никаких параметров, но чтобы my_endpoint_2 возвращал что-то вроде ошибки 400, когда параметр myId не имеет значения.

class MyController < ApplicationController
  def my_endpoint_1
    do_something
  end

  def my_endpoint_2
    id = params[:myId]
    do_something_with id
  end
end

Маршрут для my_endpoint_2 настроен в моем routes.rb:

get 'mycontroller/my_endpoint_2/:myId'

Ответы [ 2 ]

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

Если параметр myId не указан, маршрут не будет совпадать, и поэтому рельсы вернут 404 НЕ НАЙДЕНО в процессе производства.

Таким образом, конечная точка уже требует этот параметр.Однако обе конечные точки позволяют указывать произвольные параметры (например, через mycontroller/my_endpoint_2/5?my_param=5), но, поскольку они будут игнорироваться, это не должно создавать проблем.Но, как вы просили специально для сообщения об ошибке в таких случаях, вот один из подходов, которые вы можете использовать:

class MyController < ApplicationController
  def my_endpoint_1
    return if render_400_on_wrong_params

    do_something
  end

  def my_endpoint_2
    return if render_400_on_wrong_params(:myId)

    id = params[:myId]
    do_something_with id
  end

  private

  def render_400_on_wrong_params(allowed = nil)
    unsolicited_params = params.keys - Array(allowed)

    if unsolicited_params.any?
      render plain: "Unsolicited params: #{unsolicited_params.join(', ')}", status: 400
    end 
  end
end  

Было бы также целесообразно извлечь это в before_action , но функциональностьостанется в основном таким же.

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

Вы можете позвонить require по параметрам

params.require(:myId)

Это вызовет исключение ActionController::ParameterMissing, если параметр отсутствует.

https://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require

Затем вы можете спасти это исключение в ApplicationController следующим образом:

rescue_from 'ActionController::ParameterMissing' do |exception|
  render plain: '', status: 400
end

https://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html

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