2016-10-07 38 views
4

我有一個嵌套的資源,比如這一個Rails應用程序:rails:有沒有一種方法可以使用`link_to`自動生成嵌套資源?

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 %> 

我必須用這樣的:因爲sale_path沒有定義

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

第一種情況是不行的(僅product_sale_path是)。

我的問題是:我可以在銷售模式中添加什麼東西,以便link_to(或url_for)在生成url時自動添加「父級」(本例中爲產品)?

我試過看the implementation of url_for,我認爲我可以通過monkypatching HelperMethodBuilder.url.handle_model_call來做到這一點,但我寧願不這樣做,如果有另一種方式。

回答

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(向下滾動到淺嵌套)

+0

我打算把這個作爲答案,但它不是我最終使用的(我給了我所有的模型一個'Linkable'模塊有一個「路徑」方法,它返回'self',並在需要時覆蓋該方法。但我仍然必須執行'link_to @ sales.path'而不是'@ sales')。 – kikito

2

使用淺嵌套可能有幫助:

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

看一看的 Rails Routing指南第2.7.2。

+0

奇怪的兩種答案,建議及時在同一時刻給予相同的解決方案如何,可以得到upvotes和其他沒有。+1爲正義:) –

+1

@Matt的答案更加詳細,他在幾秒前發佈了它 - 他值得更多的信用。 – eugen

+0

好吧,當我打開這個問題,我看到兩個'回答12分鐘前':) –

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)

相關問題