Rails route constraints api 引见

Rails route constraints api 介绍

Rails 为route的路由约束提供了constraints 方法,具体的使用如下:

  • 限制IP地址
    constraints(:ip => /192.168.\d+.\d+/) do
      resources :posts
    end
     可以提供一个ip或者一个ip地址的范围进行限制,一旦检测到用户的ip地址符合限制范围,则会告知不存在此route。

  • 匹配动态请求

    这个例子是控制route只能被iPhone访问。
    1,第一种做法,传递block,如下:
    constraints(lambda { |req| req.env["HTTP_USER_AGENT"] =~ /iPhone/ }) do
      resources :iphones
    end
    通过传入一个block的方式来匹配HTTP_USER_AGENT是否匹配iPhone,如果是true则可以访问iphones这个资源路径。

    但是第一方法比较粗暴,代码不够整洁,如果逻辑复杂,就显得啰嗦,所以可以选择第二种方法

    2,第二种做法,传递一个Class,并且在这Class必须实现matches? 方法。

    我们事先在ib/constraints 定义一个Iphone Class:
    class Iphone
      def self.matches?(request)
         request.env["HTTP_USER_AGENT"] =~ /iPhone/
      end
    end

    接着在把第一方法的代码修改为: 
    constraints(Iphone) do
      resources :iphones
    end
    
    这样我们就可以把逻辑全部放在Iphone了

参考资料:  

   例子实现:  https://gist.github.com/bsodmike/1369419

   Rails Guide: http://guides.rubyonrails.org/routing.html#segment-constraints

   同时如果你觉得在本文中介绍太简单,可以移步官方源码实现,并且附带有此api的详细guides:

  https://github.com/rails/rails/blob/7c7fb3a862651d87c4071e40a1799b973f626b11/actionpack/lib/action_dispatch/routing/mapper.rb#L693