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