Настройка
У меня есть стандартная вложенная модель (обратите внимание на param: :uid
):
resources :orders, param: :uid do
resources :items
end
, которая дает следующие маршруты:
order_items GET /orders/:order_uid/items items#index
POST /orders/:order_uid/items items#create
new_order_item GET /orders/:order_uid/items/new items#new
edit_order_item GET /orders/:order_uid/items/:id/edit items#edit
order_item GET /orders/:order_uid/items/:id items#show
PATCH /orders/:order_uid/items/:id items#update
PUT /orders/:order_uid/items/:id items#update
DELETE /orders/:order_uid/items/:id items#destroy
Все хорошо.
Проблема
Когда я пытаюсь создать вложенную форму для элемента, я делаю следующее:
<%= form_with(model: [item.order, item], local: true) do |form| %>
...
<% end %>
, который отлично работает как для new
, так и edit
. Проблема в том, что order.id
используется для идентификации заказа, а не order.uid
.
Обходные пути
Один рабочий раствор это установить
def to_param
uid
end
в модели заказа, но это нарушает другие части приложения, потому что иногда необходимо скрыть UID.
Когда я добавляю аргумент url (примечание:'order_items_url' с 's'):
<%= form_with(model: [item.order, item], url: order_items_url(item.order.uid), local: true) do |form| %>
...
<% end %>
работает только для new
, но не для edit
.
Когда я пытаюсь с (примечание: 'order_item_url' без 's '):
<%= form_with(model: [item.order, item], url: order_item_url(item.order.uid, item.id), local: true) do |form| %>
...
<% end %>
это работает только для edit
, а не для new
.
Я также мог бы сделать отдельную форму new
edit
или передатьurl в качестве аргумента частичной формы.
Вопрос
Но есть ли лучший (рельсовый) способ? Можно ли, например, для каждого объекта (order
и item
) указать, какую переменную использовать в URL-адресе в теге формы?