验证模型中没有的url参数的最佳方法是什么。
具体来说,我有一条如下路线:
get 'delivery_windows/:date',
to: 'delivery_windows#index',
:constraints => { :date => /\d{4}-\d{2}-\d{2}/ },
as: :delivery_windows
我想确保:日期是有效日期,正则表达式不是解决方案。日期不能过去,不会超过3个月。
提前谢谢
答案 0 :(得分:2)
虽然我不确定自己是否会在路由图层中处理此问题,但您应该可以使用Advanced Routing Constraints。
这个想法是constraints
可以接受响应matches?
的对象。如果matches?
返回true,则约束通过,否则约束失败。一个简单的实现如下:
在config/routes.rb
中,包括以下内容:
require 'routing/date_param_constraint'
get 'delivery_windows/:date',
to: 'delivery_windows#index',
constraints: DateParamConstraint,
as: :delivery_windows
然后,在您的应用程序的某个地方(可能在lib/routing/date_param_constraint.rb
中),定义一个类如下:
module DateParamConstraint
def matches?(request)
# Check `request.parameters[:date]` to make sure
# it is valid here, return true or false.
end
end
答案 1 :(得分:0)
您可以在控制器中过滤日期,并在收到不符合要求的日期时提出404 not found
。
def show
date=params[:date].strftime("%Y-%m-%d').to_date
if date > 0.day.ago or date > 3.month.from_now
raise ActionController::RoutingError.new('Not Found')
end
end
答案 2 :(得分:0)
感谢theraraveler和sadaf2605的回应。
我最后通过使用before_action并在其中引发路由错误来完成他们的建议组合。
在我的控制器中我添加了:
class AngularApi::V1::DeliveryWindowsController < ApplicationController
before_action :validate_date_param, only: :index
def index
...
end
private
def validate_date_param
begin
Date.parse(params[:date])
rescue ArgumentError
render json: [{
param: :date,
message: "Incorrect Date Format: Date format should be yyyy-mm-dd."
}].to_json, status: :unprocessable_entity
return
end
end
end