如何验证路径参数并在 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
我正在尝试设置一个超级简单的 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