Rails-如何自定义某些控制器方法所需的参数?

时间:2019-02-14 18:12:42

标签: ruby-on-rails ruby

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

我希望my_endpoint_1不需要任何参数,但是希望my_endpoint_2 如果不包含myId参数,则返回类似400错误的信息。

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 :(得分:1)

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

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

答案 1 :(得分:0)

您可以在参数上调用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