我的 Rails 视图和控制器充斥着 redirect_to
、 link_to
和 form_for
方法调用。有时 link_to
和 redirect_to
在它们链接的路径中是显式的(例如 link_to 'New Person', new_person_path
) ,但很多时候路径是隐式的(例如 link_to 'Show', person
)。
我将一些单表继承(STI)添加到我的模型中(比如 Employee < Person
) ,所有这些方法都会因为子类的一个实例而中断(比如 Employee
) ; 当 ails 执行 link_to @person
时,它会因为 undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
而出错。Rails 正在寻找一个由对象的类名定义的路由,这个对象是 employee。没有定义这些雇员路由,也没有雇员控制器,因此也没有定义操作。
以前也有人问过这个问题:
routes.rb
将子类资源映射到父类(map.resources :employees, :controller => 'people'
)。同一个 SO 问题的最佳答案建议使用 .becomes
对代码库中的每个实例对象进行类型强制转换routes.rb
中的父类,因为那只能捕获来自 link_to
和 redirect_to
的路由中断,而不能捕获来自 form_for
的路由中断。因此,他建议在父类中添加一个方法,让子类对它们的类撒谎。听起来不错,但是他的方法给了我错误 undefined local variable or method `child' for #
。因此,看起来最优雅、最一致的答案(但并非所有的 那个都优雅,也不是所有的 那个都一致)是向 routes.rb
添加资源。除了这个对 form_for
不起作用。我需要澄清一下!为了提炼上面的选择,我的选择是
routes.rb
中超类的控制器(并且希望我不需要在任何子类上调用 form _ for)这么多互相矛盾的答案,我需要一个裁决。在我看来,似乎没有好的答案。这是轨道设计的失败吗?如果是这样的话,这是一个可以修复的 bug 吗?或者如果没有,那么我希望有人可以直接告诉我这个问题,告诉我每个选项的利弊(或者解释为什么这不是一个选项) ,哪一个是正确的答案,以及为什么。还是有一个我在网上找不到的正确答案?