2011-05-17 15 views
1

has_many記事モデルのグループモデルがあります。そして、私は次のURLパターン "{group_id}/{article_id}"を使用したいと思います。Railsでの洗練されたルートとURL生成

resource :groups do 
    resource :articles 
end 
match ':group_id/:id(.:format)', :to => 'articles#show', :as => :article 
match ':id', :to => 'groups#show', :as => :group 

しかし、レールがグループレコードと記事のレコードの正しいURLを生成するために失敗します。

はので、私は、これらの経路コードを書きました。自分のルートに一致するように自動生成された article_pathgroup_pathを置き換えるにはどうすればよいですか?

答えて

1

あなたが複数化を目にしていないため、問題が発生しています。単一のresourceルートを定義した場合、Railsはそれをidで各メンバーを参照するコレクションとして扱いません。代わりに、グループと記事の両方のための複数のresourcesをしたい:

resources :groups do 
    resources :articles 
end 

は次のルートを生成します

group_articles GET /groups/:group_id/articles(.:format)   {:action=>"index", :controller=>"articles"} 
        POST /groups/:group_id/articles(.:format)   {:action=>"create", :controller=>"articles"} 
new_group_article GET /groups/:group_id/articles/new(.:format)  {:action=>"new", :controller=>"articles"} 
edit_group_article GET /groups/:group_id/articles/:id/edit(.:format) {:action=>"edit", :controller=>"articles"} 
    group_article GET /groups/:group_id/articles/:id(.:format)  {:action=>"show", :controller=>"articles"} 
        PUT /groups/:group_id/articles/:id(.:format)  {:action=>"update", :controller=>"articles"} 
        DELETE /groups/:group_id/articles/:id(.:format)  {:action=>"destroy", :controller=>"articles"} 
      groups GET /groups(.:format)        {:action=>"index", :controller=>"groups"} 
        POST /groups(.:format)        {:action=>"create", :controller=>"groups"} 
     new_group GET /groups/new(.:format)       {:action=>"new", :controller=>"groups"} 
     edit_group GET /groups/:id/edit(.:format)     {:action=>"edit", :controller=>"groups"} 
      group GET /groups/:id(.:format)       {:action=>"show", :controller=>"groups"} 
        PUT /groups/:id(.:format)       {:action=>"update", :controller=>"groups"} 
        DELETE /groups/:id(.:format)       {:action=>"destroy", :controller=>"groups"} 

あなたはgroupsarticlesセグメントをオフのままにしたい場合は、それぞれに:path => ''を渡すことができますresourcesの定義に従いますが、http://example.com/1/2へのリクエストはグループの下の記事にマップされ、エンドユーザーとボットには似通っていないため注意深く踏みにじる必要があります。

+0

ああ、申し訳ありませんが、私は 'resources'を使うつもりでした。しかし、 ':path => '''オプションは機能します – ShiningRay

関連する問題