所以这是有问题的路线:
resources :subjects, path: 'library' do
resources :modules, controller: 'subject_modules'
end
当我写form_for [@subject, @subject_module]
(将这两个设置为你期望的那个)时,Rails会尝试生成“subject_subject_module_path”。
当我删除主题资源的:path
时,生成的帮助程序保持不变(如预期的那样)。
应该是什么“subject_module_path”;我怀疑问题是Rails在控制器中查看模块资源并使用它来代替其实际路径,即它构建了这个帮助器:
主题_ + subject_module _ +路径
从我到目前为止收集到的内容来看,它指向了一个错误的可能性,但它是否有可能在我身边或设计意图?
目前,我认为这可用作临时修复:
form_for([@subject, @subject_module], url: subject_module_path(@subject, @subject_module))
我正在使用Rails 3.1.3。
答案 0 :(得分:1)
如果这是一个表格(更新或创建),那么您的路线应该指向
subjects_module_path
应生成网址
/library/modules/
你试过把表格指向
吗? form_for [:subjects, @subject_module]
?
然后会在你的subject_modules控制器
结束说实话,你的命名很混乱,可能没什么帮助。理想情况下,subject_modules
应为modules
。
答案 1 :(得分:1)
这是由于Rails的设计而发生的。
以下是Rails API文档与url_for
相关的内容:
依赖命名路线
传递记录(如活动记录或活动资源)而不是 一个哈希作为选项参数将触发该命名路由 记录。查找将在类的名称上进行。通过一个 Workshop对象将尝试使用workshop_path路由。如果你 有一个嵌套的路由,例如你必须调用的admin_workshop_path 明确地说(url_for不可能猜出那条路线)。
但是当你有一个“嵌套路线”时,要求明确声明一个帮助是准确的。如果嵌套发生在资源下(没有特定类型的路由选项,稍后会有更多),Rails将能够生成路径而没有任何问题。
form_for
似乎在某些时候,例如url_for
,请致电polymorphic_url
以生成定位网址,然后调用build_named_route_call
。
您可以看到build_named_route_call
只是生成传入的ModelNames的underscored_versions,并将它们与下划线连接在一起。
将其带回我的路线:
resources :subjects, path: 'library' do
resources :modules, controller: 'subject_modules'
end
由于主题资源在/ library /下设置:path
,因此其帮助程序保持为subjects_*
,因此Rails在传递时为其生成URL没有任何问题一个Subject
。 subject_modules
资源(因为Rails为模型保留名称Module),因此已将其命名助手从其型号名称更改为:controller
。< / p>
神秘解决了。