Rails Routes中的两件事

by 里克 2013年11月03日 routes constraints rails

写在前面:在看devise的源码过程中,发现Devise在做Routes Mapping时,使用了Rails自己的@constraints。于是查查文档,笔记两件事。

一下内容来自 Ruby on Rails 4.0.1, ActionDispatch::Routing::Mapper::Scoping 。

位置:actionpack/lib/action_dispatch/routing/mapper.rb

第一件事:

这种写法很熟悉的。

namespace "admin" do
  resources :posts, :comments
end

那么,访问/posts时,调用 Admin::PostsController 时,如何写呢?

scope module: "admin" do
  resources :posts
end

或者

resources :posts, module: "admin"

当然,反过来,访问 /admin/posts 时,调用 PostsController,就这么写:

scope "/admin" do
  resources :posts
end

或者

resources :posts, path: "/admin/posts"

第二件事:

如何限制访问?比如允许 /posts/1.1 访问,而禁止 /posts/1,那么代码如下:

constraints(id: /\d+\.\d+/) do
  resources :posts
end

在其他的资源引用上,也可以做如下限制:

resources :posts do
  constraints(post_id: /\d+\.\d+/) do
    resources :comments
  end
end

限制ip访问,比如 只允许 192.168.* 访问资源:

constraints(ip: /192\.168\.\d+\.\d+/) do
  resources :posts
end

动态请求的匹配,比如下面的这个限制:

constraints(lambda { |req| req.env["HTTP_USER_AGENT"] =~ /iPhone/ }) do
  resources :iphones
end

当然你也可以把它放到model里:

class Iphone
  def self.matches?(request)
    request.env["HTTP_USER_AGENT"] =~ /iPhone/
  end
end

下面这句话有待验证,暂时不译:

An expected place for this code would be lib/constraints.

This class is then used like this:

constraints(Iphone) do
  resources :iphones
end

  • 2016年目标:工作拿出成绩,写知乎专栏,写自习室公众号,写《Rails 实践》第二版。

  • hi,我是里克,这是我的技术博客,从2007年开始,我在这里记录工作中的点点滴滴,同时,它也让我认识了很多的朋友。我相信,『坚持』就会有好运。

  • 我的邮箱:hi(at)liwei.me

  • 《Rails 实践》rails-practice.com

  • 简书主页

  • 知乎主页

公众号
Tags
rss