2016-04-26 5 views
0

indexというリソースルートをRails 4アプリケーションに追加したいのですが、生成されたルートは期待通りにはなりません。しかし、別の名前(show_indexなど)を使用している場合は、そうです。実証するために、私は何のルートを持っていないバニラのRailsアプリから始めましょう:`index`という名前のRailsリソースルートを作成する方法はありますか?

$ rake routes 
You don't have any routes defined! 

私はconfig/routes.rbに以下を追加:以下機知Railsのルートを生成

resources :items 

Prefix Verb URI Pattern    Controller#Action 
    items GET /items(.:format)   items#index 
      POST /items(.:format)   items#create 
new_item GET /items/new(.:format)  items#new 
edit_item GET /items/:id/edit(.:format) items#edit 
    item GET /items/:id(.:format)  items#show 
      PATCH /items/:id(.:format)  items#update 
      PUT /items/:id(.:format)  items#update 
      DELETE /items/:id(.:format)  items#destroy 

アプリケーションにはshowアクションがあり、パラメータハッシュにが含まれている場合、いわゆるindexと表示されます。(こののインデックスは、コレクションののようなものではなく、アプリケーション固有のものです)。

私は、追加のパラメータを指定してshowアクションを呼び出すためのカスタムindexルートを追加します。

resources :items do 
    get 'index' => 'items#show', with: 'index' 
    end 

これは、新しいルートを生成するが、それは(上記のリストにedit_itemと比較)の代わりに期待iditem_idを持っています::idを取得する方法は、を使用することです

item_index GET /items/:item_id/index(.:format) items#show {:with=>"index"} 

Routing documentation であるため、ルートは

get 'index' => 'items#show', with: 'index', on: :member 

である必要がありますが、期待される結果が得られません。これは、予想されるルートが追加されますが、それは使用するのではなく、デフォルトshowアクションからitemメソッドの接頭辞を盗み、独自index_item(再び、上記のリストでedit_itemと比較して):しかし

item GET /items/:id/index(.:format) items#show {:with=>"index"} 
    GET /items/:id(.:format)  items#show 

、私は以外のものを使用していましたindex、このようshow_indexとして、それが期待どおりに動作します:

get 'show_index' => 'items#show', with: 'index', on: :member 

show_index_item GET /items/:id/show_index(.:format) items#show {:with=>"index"} 
を生成します

したがって、ルートがindexと呼ばれるときの動作に違いがあります。私は、暗黙のresourcesルートがその名前を使用しているためですが、私はそれらが衝突するような方法で使用するとは思わないからです。それはindex_item(現存のitem_indexとは対照的に、既存のedit_itemに似ています)になる新しいindexルートを追加できるように見えます。

私が実証したように、別の名前を使用して問題を回避することができます。しかし、indexshow_indexより読みやすい。

indexとリソースルートを指定することは可能ですか?:id? `

+0

で、 'get「はインデックス」=>「アイテム#ショー」してみてください:「インデックス」は、上:等の部材、「 –

+0

をitem_index''レールの一つ」キーコンセプトは「設定より規約」です。あなたの計画は、7つのRailsデフォルトアクションの1つをルート名として使用することです。この決定では、規約を超えた設定を使用しています。これはRailsのアンチパターンです。それを動作させることは可能ですか?確かに、Railsアプリケーションでの作業の例として示したいコードではありません。 – Elvn

+0

しかし、これは7つのレールのデフォルトアクションを変更しません。これは、7つのデフォルトアクションに適合する別のアクションを追加します。そのアクションの論理名は 'index'ですが、何らかの形でデフォルトアクションには影響しません。 – starfry

答えて

1

は、特定のURLがasキーワードを使用して設定し、そのような何かしようとするには:あなたの希望のコースの

get 'index' => 'items#show', with: 'index', on: :member, as: 'item_index' 

または1つを。

+0

'item_index'を使うと' item_index_item'という接頭辞が付いたメソッドが返されますが、 'index'を使うと' index_item'の結果が得られます。 – starfry

関連する問題