6

我正在为我的应用程序做一个报告系统。 例如,我创建了一个ReportKind模型,但由于我可以报告很多东西,我想要创建不同的报告种类组。由于他们共享很多行为,我试图使用继承。Rails模型继承的形式

所以我主要型号:

model ReportKind << ActiveRecord::Base 
end 

和例如创建:

model UserReportKind << ReportKind 
end 

在我的桌子report_kinds我已经类型列,直到这里的所有工作。 我的问题是在窗体/控制器。

当我做ReportKind.new时,我的表单是用'* report_kind *'前缀构建的。 如果获得UserReportKind,即使通过,表单也会构建'user_report_kind'前缀。

这个乱七八糟的东西在控制器里,因为有时我会有params [:report_kind],有时params [:user_report_kind]等等,对于我做的每一个继承。

有没有办法强制它使用'report_kind'前缀? 另外,我不得不在控制器中强制使用'type'属性,因为它没有直接从表单中获取值,是否有一种很好的方法可以做到这一点?

路由是另一个问题,因为它试图基于继承的模型名称来构建路由。我通过在指向同一控制器的路由中添加其他模型来克服这一点。

回答

6

这种继承总是很棘手。幸运的是,你提到的问题都是可以解决的。

首先,你可以强制的形式使用特定的属性名称和URL这样的:

<%= form_for :report_kind, @report_kind, :url => report_kind_path(@report_kind) %> 

这将迫使所有params用于在@report_kind是在PARAMS [:report_kind]无论@report_kind是否是UserReportKind与否。此外,所有的post和put请求也将转到ReportKindsController。

其次,你可以用一个隐藏属性像这样指定类型:

<%= form.hidden_field :type, 'UserReportKind' %> 

最后,路线,我会做到以下几点:

map.resources :user_report_kinds, :controller => :report_kinds 

这将意味着像/任何URL user_report_kinds/...实际上会使用ReportKindsController。

+0

<%= form.hidden_​​field:type,:value =>'UserReportKind'%> 为我工作。 – cider 2013-03-13 16:37:09