У меня есть довольно простая (я думаю) настройка наследования одной таблицы (STI) в моем приложении Rails.
Есть модель User с вложенным ресурсом Post. Используя STI, у меня есть так, что некоторые сообщения могут быть объектами Post::Urgent.
Я заметил, что мои помощники URL, такие как <%= [@user, @post] %>
, должны быть жестко запрограммированы на <%= user_post_path[@user, @post] %>
, иначе я в конечном итоге увижу ошибки о том, что Rails не находит метод user_post_urgent_path
. Хорошо, это было достаточно легко.
(Альтернативный способ сделать это также <%= [@user, post: @post] %>
.)
Ну не могу я почему-то сообразить, как сделать так, чтобы метод form_for
настраивался точно так же. Когда я пишу просто
<%= form_for [@user, @post] do |f| %>
, я получаю такие же ошибки, как и в случае со вспомогательной функцией URL, но в контексте формы: undefined method 'user_post_urgen_path'
.
Я исправил это, указав:
<%= form_for [@user, @post], url: :user_post do |f| %>
Но это не работает полностью, потому что, когда я иду отправлять форму, у меня возникают проблемы в моем контроллере, говоря, что строка сильных параметров params.require(:post)
не удалась:
param is missing or the value is empty: post
Если я проверю params
, то обнаружу, что форма передает объект post_urgent
, а не объект post
.
Я мог бы, конечно, вручную ввести некоторую логику, которая всегда говорит if !params[:post] and params[:post_urgent], then params[:post] = params[:post_urgent]
. Но это кажется слишком слишком хакерским, особенно для Rails.
Есть ли лучший способ заставить подобную форму «просто работать» независимо от того, каким подклассом модели Post она фактически является?