在Rails 4中验证不在模型中的url参数

时间:2015-11-11 06:52:18

标签: ruby-on-rails

验证模型中没有的url参数的最佳方法是什么。

具体来说,我有一条如下路线:

get 'delivery_windows/:date',
        to: 'delivery_windows#index',
        :constraints => { :date => /\d{4}-\d{2}-\d{2}/ },
        as: :delivery_windows

我想确保:日期是有效日期,正则表达式不是解决方案。日期不能过去,不会超过3个月。

提前谢谢

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