Tia*_*ago 6 forms inheritance activerecord ruby-on-rails ruby-on-rails-3
我正在为我的应用做一个报告系统.我创建了一个模型ReportKind,但是由于我可以报告很多东西,我想制作不同类型的报告类型.由于他们共享很多行为,我正在尝试使用继承.
所以我有主要模型:
model ReportKind << ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
并创建了例如:
model UserReportKind << ReportKind
end
Run Code Online (Sandbox Code Playgroud)
在我的表report_kinds中,我是类型列,直到这里它的全部工作.我的问题在于表单/控制器.
当我这样做时ReportKind.new,我的表单是使用'*report_kind*'前缀构建的.如果获得UserReportKind,即使通过a ReportKind.find,表单也会构建'user_report_kind'前缀.
这会使控制器中的所有内容变得混乱,因为有时候我会有params [:report_kind],有时候是params [:user_report_kind],等等我所做的每一个其他继承.
无论如何强迫它使用'report_kind'前缀?此外,我不得不强制控制器中的属性'type',因为它没有直接从表单中获取值,是否有一个很好的方法来做到这一点?
路由是另一个问题,因为它试图基于继承的模型名称构建路由.我通过在指向同一控制器的路由中添加其他模型来克服这个问题.
这种继承总是很棘手.幸运的是,你提到的问题都是可以解决的.
首先,您可以强制表单使用特定的属性名称和URL,如下所示:
<%= form_for :report_kind, @report_kind, :url => report_kind_path(@report_kind) %>
Run Code Online (Sandbox Code Playgroud)
无论@report_kind是否为UserReportKind,这都会强制@report_kind的所有参数都在params [:report_kind]中.此外,所有post和put请求也将转到ReportKindsController.
其次,您可以使用隐藏属性指定类型,如下所示:
<%= form.hidden_field :type, 'UserReportKind' %>
Run Code Online (Sandbox Code Playgroud)
最后,对于路线,我会做以下事情:
map.resources :user_report_kinds, :controller => :report_kinds
Run Code Online (Sandbox Code Playgroud)
这意味着像/ user_report_kinds/...这样的任何URL实际上都会使用ReportKindsController.
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |