Rails中如何正确定义控制器名称解决路由不支持报错
Rails路由配置错误排查及修复方案
错误原因
- 控制器与路由引用不匹配:你定义的控制器是
Panel命名空间下的CcApisController(Apis为复数),路由中错误写为单数的CcApiController,不符合Rails命名约定。 - 路由语法错误:
resources后需接小写蛇形复数的资源名,不能直接写控制器类名,同时命名空间下的控制器需要套namespace块配置路由,你之前写的resources: CcApiController属于语法错误,符号位置和参数格式都不符合要求。 - 路由重复配置:你同时在
routes.rb和panel_routes.rb中配置同一份资源,会引发路由冲突。 - 自定义方法未做路由映射:你需要调用的
make_request方法没有在路由中做对应配置,无法被外部访问。
修复步骤
- 修正路由配置
删除routes.rb中原有的错误配置,以及panel_routes.rb中错误的draw_api_routes方法内容,按如下格式配置:
# config/routes.rb Rails.application.routes.draw do # 匹配Panel命名空间 namespace :panel do # 对应CcApisController,只保留index接口 resources :cc_apis, only: [:index] do collection do # 给make_request方法配置POST路由,对外暴露路径为/panel/cc_apis/translate post :translate, action: :make_request end end end end
如果需要保留panel_routes.rb的抽离配置,也按上述语法规则修改即可。
- 完善控制器逻辑
将make_request方法移入CcApisController中,同时适配前端请求参数,增加JSON返回格式:
# app/controllers/panel/cc_apis_controller.rb module Panel class CcApisController < CcenterBaseController # 若有全局登录校验,可加skip_before_action跳过校验方便前端调用,按需开启 # skip_before_action :verify_authenticity_token def index run Ccenter::Adapters::Zendesk::TranslationApi.call(2116449) end def make_request # 接收前端传过来的待翻译文本参数 @final_ticket = params[:text] response = Faraday.post( 'https://api.deepl.com/v2/translate', auth_key: '替换为你的实际Deepl密钥', text: @final_ticket, target_lang: 'DE', source_lang: 'EN' ) if response.status == 200 body = response.body message_element = body.split('"')[-2] # 返回JSON格式给前端 render json: { translated_text: message_element } else raise InvalidResponseError unless response.success? end end end end
- 验证配置
执行命令bin/rails routes | grep cc_apis,即可看到生成的合法路由,翻译接口的调用路径为/panel/cc_apis/translate,请求方法为POST,前端直接用Fetch调用即可。
若存在跨域问题,在config/initializers/cors.rb中配置允许的前端域名即可。
内容的提问来源于stack exchange,提问作者user16741832
相关产品推荐
相关产品推荐

