Rails Модель наследования в формах - PullRequest
6 голосов
/ 19 февраля 2011

Я делаю систему отчетности для своего приложения. Например, я создал модель 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? Также мне пришлось принудительно установить атрибут «тип» в контроллере, потому что он не получил значение непосредственно из формы, есть ли хороший способ сделать это?

Маршрутизация была еще одной проблемой, поскольку она пыталась построить маршруты на основе имен унаследованных моделей. Я преодолеваю это, добавляя другие модели в маршруты, указывающие на тот же контроллер.

1 Ответ

6 голосов
/ 19 февраля 2011

Этот вид наследования всегда сложен. К счастью, все упомянутые вами проблемы решаемы.

Во-первых, вы можете заставить формы использовать определенные имена атрибутов и URL-адреса, например:

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

Это заставит все параметры @report_kind быть в параметрах [: report_kind] независимо от того, является ли @report_kind UserReportKind или нет. Кроме того, все запросы на размещение и отправку также будут отправляться в ReportKindsController.

Во-вторых, вы можете указать тип со скрытым атрибутом, например так:

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

Наконец, для маршрутов я бы сделал следующее:

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

Это будет означать, что любой URL, например / user_report_kinds / ..., фактически будет использовать ReportKindsController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...