2009-04-17 6 views
2

のカスタムコントローラを使用しているとき、私は、実行時に動的に生成されるルートのセットを持っていますが、Railsの

map.resources :authors, :controller => 'main' 
map.resources :books, :controller => 'main' 

これらつまり同じコントローラへのすべてのポイントは、すべての生産、正常に動作することをURLからリソース名を取得します。 /authors/1/books/books/55などのルートを使用し、すべてが「メイン」コントローラで処理されます。

しかし、コントローラのリソースの名前を取得する方法、つまりURLが/authorsまたは/booksの場合のインデックスアクションでは、どのリソースがどれかを判断できるようにしたいと思っています。つまり著者または書籍

私はこれのために別のコントローラを使用することはできません。

これはすべて可能ですか?

+2

"私はこのために別のコントローラを使うことはできません"というあなたの主張は、a)レールがボークされているかb)この制約を課している他の場所で何か他のことを間違っていると結論づけます。推測私は向かっている:-) –

答えて

0

私は.resourceメソッドのようには思えませんが、あなたは/ authorsや/ booksのようなものを返すrequest.request_uriを見ることができます。

3

EDIT:ワイオフだったので、完全な回答の変更。

あなたのアクションで見られるパラメータを変更するので、実際のURIを取得する必要があります。テリーの提案と同じくらい簡単です。

def index 
    if request.request_uri =~ /books/ 
    #... 
    else 
    # if it is a author 
    end 
end 

これは本にリクエストURI(localhost:3000後になる部分)を比較し、そのユーザーが要求したものを見ることができます。

+0

私は私の質問で述べたように、私は両方のルート(メイン)のためにあなたが記述するメソッドを使用して、リソースの名前ではなく、カスタムコントローラの名前を返すように同じコントローラを使用します。この場合、メイン。 –

+0

ああ、私に知らせてくれてありがとう。私は実際にあなたの質問に答えるように私の答えを更新しました;) – vrish88

0

ActionController::Routingドキュメントの「デフォルトルートとデフォルトパラメータ」のセクションを参照してください。コントローラに送信したい任意のパラメータをルートにプログラムすることができます。

リクエストURIを見ると、ルートとコントローラを同期させる必要があります。これにより、コードが壊れやすくなり、再利用されにくくなります。可能であれば避けてください。

+0

デッドリンク...... –