设置
我有一个标准的嵌套模型(请注意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
。
解决方法
要设置一个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。
问题
但是还有更好的方法吗?例如,我可以为每个对象(order
和item
)在表单标签的url中指定要使用的变量吗?
答案 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, ...