2016-10-07 15 views
4

は、私がこのようなネストされたリソースを、とレールのアプリを持っている: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です)。

私の質問:URLを生成するときに、link_to(またはurl_for)が自動的に「親」(この場合は製品)を追加するように、何かを販売モデルに追加できますか?

私はthe implementation of url_forを見てみましたが、私はHelperMethodBuilder.url.handle_model_callのMonkeypatchingでこれを行うことができたと思いますが、別の方法がある場合はそれをやりません。役立つかもしれない浅いネスティングを使用して

答えて

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

私は答えとしてこれを取るつもりですが、私が使用し終わったものではありません(私はすべてのモデルに 'モジュールは 'self'を返す' path'メソッドを持っていて、必要なときにそのメソッドをオーバーライドしました。 '@ sales'ではなく' link_to @ sales.path'を実行しなければなりませんでした。 – kikito

2

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

Rails Routingガイドのセクション2.7.2を見てください。

+0

奇妙な、一つはupvotesを取得し、他にはありません。+1の正義:) –

+1

@Mattの答えはより詳細で、数秒前に投稿しました - 彼はより多くのクレジットが必要です。 – eugen

+0

私が質問を開いたとき、私は2つが「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パスにリンクします。

私は複数の販売を持つことができる製品を推測しています。インデックスアクションにリンクするには、製品が必要です。 2つの答えが時間内に同じ瞬間に与えられた同じ溶液を推薦する方法

link_to product_sales_path(@sale.product)

関連する問題