如何验证路径参数并在 Rails 中显式设置状态代码

How to validate path params and explicitly set status codes in Rails

我正在尝试设置一个超级简单的 RESTful 端点(作为 ApplicationController),它执行简单的路径参数验证并且 return 是一个硬编码的 JSON 响应:

{
  "foo" : "123",
  "bar" : {
    "whistle" : "feather",
    "ping" : "pong"
  }
}

命中的 URL 是 GET http://localhost/widgets/${widgetId}/${fizzbuzzId},其中 ${widgetId}${fizzbuzz} 都应为正整数。

我想知道如何检查 ${widgetId}${fizzbuzzId} 的值,如果它们不是正整数则抛出 400。如果两个路径参数通过验证,我也在尝试弄清楚如何 return 将硬编码的 response 字符串作为状态代码为 200 的 HTTP 响应实体:

routes.rb中:

resource :widgets

然后是控制器:

class WidgetsController < ApplicationController
  def show
    if(params[:widgetId].to_i <= 0 || params[:fizzbuzzId] <= 0) {
      render json: { "error" : "bad path params" }, status: :not_found
      return
    }

    response = %(
      {
        "foo" : "123",
        "bar" : {
          "whistle" : "feather",
          "ping" : "pong"
        }
      }
    )

    render json: response, status: :ok 
  end
end

当我 运行 我得到:

myuser:myapp myuser$ curl -k http://localhost:3000/widgets

SyntaxError at /widgets
==============================

> syntax error, unexpected '{', expecting keyword_then or ';' or '\n'
/Users/myuser/myapp/app/controllers/widgets_controller.rb:4: syntax error, unexpected ':', expecting =>
      render json: { "error" : "bad path params ...
                              ^
/Users/myuser/myapp/app/controllers/widgets_controller.rb:4: syntax error, unexpected '}', expecting keyword_end
...ad path params" }, status: :not_found
...                               ^
/Users/myuser/myapp/app/controllers/widgets_controller.rb:6: syntax error, unexpected '}', expecting keyword_end

app/controllers/widgets_controller.rb, line 3
----------------------------------------------------

``` ruby
    1   class WidgetsController < ApplicationController
    2     def show
>   3       if(params[:widgetId].to_i <= 0 || params[:fizzbuzzId] <= 0) {
    4         render json: { "error" : "bad path params ID" }, status: :not_found
    5         return
    6       }
    7   
    8       response = %(
```

App backtrace
-------------

 - app/controllers/widgets_controller.rb:3:in `'
 - app/middleware/catch_json_parse_errors.rb:8:in `call'

Full backtrace

知道我哪里出错了吗?

您可以使用以下方法检查您的参数是否为正整数:

>> "23".to_i > 0
=> true
>> "foo".to_i > 0
=> false

因此您可以通过 params[:widgetId].to_i > 0 将其用于您的参数 这对你有意义吗?

此外,如果您想 return 您的错误响应,您需要 return "early" 否则控制器会抱怨双重渲染:

render json: { "error" : "bad input" }, status: :400 and return