如何用单个控制器创建2个路由?调整Contacts控制器的vendors路由路径
嘿,我来帮你搞定这两个Rails路由问题,都是日常开发里很常见的场景~
问题1:仅用一个控制器创建2个路由
这事儿超简单,直接在你的config/routes.rb文件里,为同一个控制器指定不同的路由规则就行,分两种常见情况:
情况1:两个路由对应控制器的不同动作
比如你有一个PagesController,想创建/home和/about两个路由,分别对应控制器里的home和about动作,写法如下:
get 'home', to: 'pages#home' get 'about', to: 'pages#about'
情况2:两个路由对应控制器的同一个动作
如果想让两个不同URL触发同一个动作(靠参数区分逻辑),可以这么写:
get 'home', to: 'pages#show', defaults: { page: 'home' } get 'about', to: 'pages#show', defaults: { page: 'about' }
之后在PagesController的show动作里,就能通过params[:page]判断是处理home还是about的逻辑了。
问题2:为Contacts控制器添加独立的vendors路由
你现在用resources :contacts生成的嵌套路由不符合需求,咱们直接把vendors/:id这个路由单独拎出来,指定到ContactsController的vendors动作就行,完全不用新建控制器。
步骤1:修改routes.rb
把独立的vendors路由放在resources :contacts之前(避免被RESTful路由规则覆盖),写法如下:
# 定义独立的vendors路由,生成路由辅助方法vendor_path(id) get 'vendors/:id', to: 'contacts#vendors', as: :vendor # 保留原有的contacts资源路由 resources :contacts
步骤2:在ContactsController里添加动作
接下来只需要在ContactsController里新增vendors动作,处理对应的业务逻辑:
class ContactsController < ApplicationController # ... 你已有的其他动作 def vendors # 比如根据params[:id]获取对应的Contact记录 @contact = Contact.find(params[:id]) # 后续渲染视图、返回JSON等逻辑 end end
这样访问vendors/123就会直接触发ContactsController#vendors动作,路径完全符合你的需求~
内容的提问来源于stack exchange,提问作者CrescentStrike
相关产品推荐
相关产品推荐

