Rails:是否有一种方法可以使嵌套资源自动与`link_to`一起工作?

4

我有一个嵌套资源的Rails应用程序,例如:

resources :product do
  resources :sales
end

Sale 属于 Product 的情况下,一个 Sale 实例不能没有产品存在。

我可以使用 link_to + @product 直接链接到一个产品:

<%= link_to @product.name, @product %>

那会产生

<a href="/products/3">Strawberry Jam</a>

如果我想为销售做类似的事情,我不能仅使用@sale。我必须涉及产品。这样是行不通的:
<%= link_to @sale.date, @sale %>

我必须使用类似这样的东西:

<%= link_to @sale.date, [@sale.product, @sale] %>

第一个案例不起作用,因为sale_path未定义(仅定义了product_sale_path)。
我的问题是:我是否可以添加一些内容到Sale模型中,以便在生成URL时,link_to(或url_for)自动添加“父级”(在本例中为产品)?
我尝试查看{{link1:url_for的实现}},我认为我可以通过monkeypatching HelperMethodBuilder.url.handle_model_call来完成,但如果有其他方法,我宁愿不这样做。
3个回答

2

使用浅层嵌套可能会有帮助:

resources :product do
  resources :sales, shallow: true
end

请查看Rails Routing指南的2.7.2节。

很奇怪,两个人在同一时间推荐相同的解决方案,一个得到了赞,而另一个却没有。+1 为公正 :) - Andrey Deineko
1
@Matt的回答更为详细,并且他在几秒钟之前发布了它 - 他应该得到更多的赞誉。 - eugen
好的,当我打开这个问题时,我看到了两个“12分钟前回答”的 :) - Andrey Deineko

2
使用浅层路由是否可以避免您的问题,通过直接将url暴露给嵌套资源?
resources :products do
  resources :sales, only: [:index, :new, :create]
end
resources :sales, only: [:show, :edit, :update, :destroy]

现在,link_to @sale 将会起作用,你只需要在 index、new、create 中涉及产品即可。
参考链接:http://guides.rubyonrails.org/routing.html#nested-resources(向下滚动到浅层嵌套)。

尽管这不是我的最终方案(我给所有的模型都加上了一个“Linkable”模块,其中包含一个返回self的“path”方法,并在需要时覆盖该方法。但我仍然需要做 link_to @sales.path 而不是仅仅使用 @sales ),但我会把这个作为答案。 - kikito

1

link_to @sale.date product_sale_path(@sale.product, @sale)

或者

link_to @sale.date product_sale_path(@sale.product_id, @sale)

将链接到/products/:product_id/sales/:id路径。

我猜一个产品可以有多个销售。要链接到索引操作,您只需要产品。

link_to product_sales_path(@sale.product)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接