如何将控制器方法迁移至RESTful路由资源,避免单独定义GET路由?
解决方案:将自定义GET方法整合到RESTful资源路由
没问题!要把你的new_sms方法整合到resources :send_sms的RESTful路由里,只需要遵循Rails的约定调整几个地方,就能去掉单独的GET路由定义。下面是具体步骤:
1. 重命名控制器中的方法
RESTful资源路由里的new动作是专门用来展示创建资源的表单页面的,正好对应你new_sms的功能。所以先把控制器里的方法名改成标准的new:
修改前的SendSmsController:
class SendSmsController < ApplicationController def new_sms # 你的原有逻辑,比如初始化短信对象 @send_sms = SendSms.new end # 其他已有的index、create方法... end
修改后的SendSmsController:
class SendSmsController < ApplicationController def new # 保留原来的业务逻辑不变 @send_sms = SendSms.new end # 其他已有的index、create方法... end
2. 调整视图文件的命名
Rails的控制器动作会默认渲染同名的视图文件,所以把你的视图文件名从new_sms.slim改成new.slim:
- 原路径:
app/views/send_sms/new_sms.slim - 修改后路径:
app/views/send_sms/new.slim
视图文件的内容完全不用改,逻辑保持原样即可。
3. 更新路由配置
现在可以删掉单独的get :new_sms路由,然后在resources :send_sms的only数组里加上new动作:
修改前的routes.rb:
resources :send_sms, only: %i[index create] get :new_sms, to: 'send_sms#new_sms'
修改后的routes.rb:
resources :send_sms, only: %i[index new create]
验证效果
完成以上修改后,访问/send_sms/new就会触发SendSmsController#new动作,渲染对应的表单视图,完全符合RESTful规范,而且不用再维护单独的GET路由了。
内容的提问来源于stack exchange,提问作者Gol D. Roger
相关产品推荐
相关产品推荐

