理解Rails中的routes.rb文件
Ruby on Rails的路由系统是整个应用请求分发的核心。所有进入应用的HTTP请求,首先都会经过config/routes.rb这个文件。它就像一个交通指挥员,告诉Rails某个URL应该由哪个控制器的哪个动作来处理。
比如你在浏览器里输入/articles/5,Rails会根据路由规则决定是调用ArticlesController的show方法,并把id: 5传进去。
基本路由写法
最常见的写法是使用资源化路由(resourceful routing)。只需一行代码就能生成一组标准的RESTful路径:
resources :articles这一行会自动生成以下路由:
- GET /articles → index
- GET /articles/new → new
- POST /articles → create
- GET /articles/:id → show
- GET /articles/:id/edit → edit
- PATCH /articles/:id → update
- DELETE /articles/:id → destroy
限制资源路由的动作
并不是每个模型都需要全部七个动作。比如用户头像上传功能可能只需要new和create,这时可以用:only或:except来精简:
resources :avatars, only: [:new, :create]或者排除某些动作:
resources :logs, except: [:destroy]添加自定义动作
有时候标准动作不够用。比如想给文章添加“点赞”功能,可以这样加成员路由:
resources :articles do
member do
post 'like'
end
end这样就生成了POST /articles/1/like这样的路径,对应ArticlesController#like方法。
如果是作用在整个资源集合上的操作,比如批量发布,可以用collection:
resources :articles do
collection do
get 'drafts'
post 'publish_all'
end
end访问/articles/drafts就会调用ArticlesController#drafts。
设置根路径
新项目通常要设置首页。比如让访问根目录时显示文章列表:
root 'articles#index'这样访问/就等同于访问/articles。
命名路由与路径辅助方法
Rails会自动为路由生成路径辅助方法。比如resources :comments后,就可以在视图中使用new_comment_path或comment_path(@comment)。
你也可以自定义名称:
get 'about', to: 'pages#about', as: 'about_us'这样就能用about_us_path来生成/about的路径。
约束条件的应用
有时需要对参数格式做限制。比如确保文章ID只能是数字:
resources :articles, constraints: { id: /\d+/ }或者针对子域名做路由区分:
constraints subdomain: 'admin' do
resources :users
end这样只有admin.example.com下的请求才会匹配到用户管理路由。
挂载引擎
在大型项目中,常会把某些功能拆成独立的Rails引擎。比如后台管理系统可以做成一个引擎,然后在主应用中挂载:
mount Admin::Engine, at: '/admin'所有以/admin开头的请求都会交给Admin引擎处理,保持主路由清晰简洁。