首页 > 解决方案 > Rails - 如何为某些控制器方法自定义所需的参数?

问题描述

我有一个带有几种方法的控制器。我希望能够为某些路线要求某些参数。

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'

标签: ruby-on-railsruby

解决方案


如果myId未提供参数,则路线将不匹配,因此 rails 在生产时将返回 404 NOT FOUND。

因此,端点已经需要该参数。但是,两个端点都允许提供任意参数(例如 via 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中也是有意义的,但功能将基本保持不变。


推荐阅读