Ruby中form_with使用字符串拼接路由路径失效问题排查
Ruby ERB表单路由差异问题解析
问题场景
在Ruby ERB视图中,直接使用路由辅助方法的表单提交路由完全符合预期:
<%= form_with url: new_cmd_gllic_controller_path, method: 'get' do |f| %>
但通过字符串拼接生成路径的代码却无法正常匹配路由,提交后会跳转到{parent resource}/new_cmd_gllic_path这种错误路径:
<% @var= 'cmd_gllic' %> <% @filePath = 'new_' + @var+ '_controller_path'%> <%= form_with url: @filePath, method: 'get' do |f| %>
对应的routes.rb路由配置如下:
get 'new_cmd_gllic_controller', to: 'cmd_gllic#new', as: :new_cmd_gllic_controller
差异原因
- 直接调用辅助方法的逻辑:
new_cmd_gllic_controller_path不是普通字符串,而是Rails根据routes.rb里的as: :new_cmd_gllic_controller配置自动生成的路由辅助方法。调用这个方法时,Rails会内部解析对应的路由规则,返回正确的绝对URL路径(比如/new_cmd_gllic_controller)。 - 字符串拼接的问题:你拼接出来的
@filePath只是一个值为"new_cmd_gllic_controller_path"的普通字符串,并没有触发方法调用。当form_with接收到字符串类型的url参数时,Rails会默认把它当作相对路径处理,自动拼接当前页面所在的父资源路径,最终生成错误的URL。
解决办法
如果需要动态生成路由路径,要通过字符串调用对应的路由辅助方法,而不是直接传字符串。可以用Ruby的send方法实现动态调用:
<% @var= 'cmd_gllic' %> <% @filePath = send("new_#{@var}_controller_path") %> <%= form_with url: @filePath, method: 'get' do |f| %>
这里send方法会根据传入的字符串名称,调用对应的路由辅助方法,返回正确的URL路径,表单提交就能匹配到预期的路由了。
内容的提问来源于stack exchange,提问作者Sean Gillespie
相关产品推荐
相关产品推荐

