【问题标题】:Rails Model inheritance in forms表单中的 Rails 模型继承
【发布时间】:2011-02-18 23:23:03
【问题描述】:

我正在为我的应用创建一个报告系统。 例如,我创建了一个模型 ReportKind,但是因为我可以报告很多东西,所以我想制作不同的报告类型组。由于他们有很多共同的行为,我正在尝试使用继承。

所以我有主模型:

model ReportKind << ActiveRecord::Base
end

并创建例如:

model UserReportKind << ReportKind
end

在我的表 report_kinds 中,我有类型列,直到这里它都可以正常工作。 我的问题出在表单/控制器中。

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

这弄乱了控制器中的所有内容,因为有时我会有 params[:report_kind],有时还有 params[:user_report_kind],等等我创建的所有其他继承。

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 forms inheritance activerecord


    【解决方案1】:

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

    首先,您可以强制表单使用特定的属性名称和 URL,如下所示:

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

    这将强制 @report_kind 的所有参数都在 params[:report_kind] 中,无论 @report_kind 是否是 UserReportKind。此外,所有 post 和 put 请求也将发送到 ReportKindsController。

    其次,您可以使用隐藏属性指定类型,如下所示:

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

    最后,对于路线,我会做以下事情:

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

    这意味着像 /user_report_kinds/... 这样的任何 URL 都将实际使用 ReportKindsController。

    【讨论】:

    • 'UserReportKind' %> 为我工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多