带有自定义参数的嵌套表单

时间:2019-11-05 09:27:00

标签: ruby-on-rails

设置

我有一个标准的嵌套模型(请注意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 %>

newedit都非常适用。问题在于,order.id用于标识顺序,而不是order.uid

解决方法

要设置一个working solution

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作为参数传递给form-partial。

问题

但是还有更好的方法吗?例如,我可以为每个对象(orderitem)在表单标签的url中指定要使用的变量吗?

1 个答案:

答案 0 :(得分:0)

这感觉就像是一个Rails错误,可以想象Rails会使用这些路由正确地构建嵌套的路由,但是由于某种原因,它似乎不起作用?

一个简单的解决方法是编写类似

的内容
<% 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, ...