Вложенная форма с пользовательским параметром - PullRequest
0 голосов
/ 05 ноября 2019

Настройка

У меня есть стандартная вложенная модель (обратите внимание на 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-адресе в теге формы?

1 Ответ

0 голосов
/ 05 ноября 2019

Это похоже на ошибку рельсов, можно было бы предположить, что рельсы будут использовать маршруты для правильного построения вложенных маршрутов, но почему-то это не работает?

Простой обходной путь - написать что-то вроде

<% item_url = item.new_record? ? order_items_url(item.order.uid) : order_item_url(item.order.uid, item.id) %>
<%= form_with(model: [item.order, item], url: item_url, ... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...