在rails中处理STI子类的路由的最佳实践
我的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
)分解; 当rails执行link_to @person
, undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
, undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
发生错误。 Rails正在寻找由该对象的类名称定义的路由,该名称是员工。 这些员工路线未定义,并且没有员工控制器,因此这些操作也未定义。
这个问题之前曾被问过:
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) 所有这些相互矛盾的答案,我需要一个裁决。 在我看来,似乎没有好的答案。 这是轨道设计失败吗? 如果是这样,它是一个可能得到修复的错误? 或者如果没有,那么我希望有人能够让我直接了解这一点,通过每个选项的利弊(或解释为什么这不是一种选择),哪一个是正确的答案,以及为什么。 或者有没有一个正确的答案,我没有在网上找到?
这是我能够以最小的副作用提出的最简单的解决方案。
class Person < Contact
def self.model_name
Contact.model_name
end
end
现在, url_for @person
将按照预期映射到contact_path
。
工作原理: URL助手依靠YourModel.model_name
来反思模型并生成(在许多事情中)单数/复数路由密钥。 这里Person
基本上是说我就像Contact
老兄,问他。
我有同样的问题。 使用STI后, form_for
方法发布到错误的子网址。
NoMethodError (undefined method `building_url' for
我最终为子类添加了额外的路由并将它们指向相同的控制器
resources :structures
resources :buildings, :controller => 'structures'
resources :bridges, :controller => 'structures'
另外:
<% form_for(@structure, :as => :structure) do |f| %>
在这种情况下,结构实际上是一个建筑物(儿童班)
在使用form_for
提交后,它似乎适用于我。
我建议你看看:https://stackoverflow.com/a/605172/445908,使用这种方法可以让你使用“form_for”。
ActiveRecord::Base#becomes
链接地址: http://www.djcxy.com/p/63551.html
上一篇: Best practices to handle routes for STI subclasses in rails