Rails错误地为资源生成路径:controller set

时间:2012-01-03 23:20:20

标签: ruby-on-rails ruby-on-rails-3

所以这是有问题的路线:

  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。

2 个答案:

答案 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没有任何问题一个Subjectsubject_modules资源(因为Rails为模型保留名称Module),因此已将其命名助手从其型号名称更改为:controller。< / p>

神秘解决了。