我有一个带有嵌套资源的rails应用程序,例如:
resources :product do
resources :sales
end
如果没有产品,Sale belongs_to 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模型中添加一些内容,以便link_to
(或url_for
)自动添加&#34; parent&#34; (产品,在这种情况下)产生网址?
我曾尝试查看the implementation of url_for
,我认为我可以通过monkeypatching HelperMethodBuilder.url.handle_model_call
来做到这一点,但如果还有其他办法,我宁愿不这样做。
答案 0 :(得分:2)
答案 1 :(得分:2)
使用浅路由会通过将直接网址暴露给嵌套资源来避免您的问题吗?
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(向下滚动到浅层嵌套)
答案 2 :(得分: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)