5

GitHubで使用されているものと同様の「コンテキスト」システムを実装しようとしています。たとえば、ユーザーが「ユーザー」コンテキストにあるか、会社の1つを参照するコンテキストにあるかに応じて、ユーザーまたはユーザーが属する会社の1つに属する投稿を作成できます。

その一環として、ユーザーの現在のコンテキストに基づいてルーティングを実行できるようにしたいと思います。たとえば、ユーザーが独自のコンテキストにいる場合は、に/dashboardルーティングする必要users/showがありますが、ID 35の会社のコンテキストにある場合は、に/dashboardルーティングする必要がありcompanies/35/dashboardます。

/dashboardそのような決定を行う責任のある特別なコントローラーにルーティングすることcontext#dashboardもできますがredirect_to、これは正しくないと感じます(おそらく、Railsルーティングモジュールが責任を負うべきロジックを採用し、に移動するためです)コントローラー?)

Rails 3でこの問題を解決する適切な方法は何でしょうか?

4

2 に答える 2

2

私はついに私が好きな問題の解決策を見つけました。これは、元の質問の URL を使用します。

Contextまず、ユーザーが「ユーザー」コンテキストまたは「会社」コンテキストのどちらにいるかを格納するセッション格納オブジェクトを想定します。ユーザーが「会社」コンテキストにある場合、ユーザーが働いている会社の ID もオブジェクトに含まれます。という名前のヘルパーを介してコンテキストを取得でき、 を介しget_contextて現在ログインしているユーザーを取得できますcurrent_user

ここで、ルートを次のように設定します。

config/routes.rb:

MyApplication::Application.routes.draw do
  get "dashboard" => "redirect", :user => "/users/show", :company => "/companies/:id/dashboard"
end

今、app/controllers/redirect_controller.rb

class RedirectController < ApplicationController
  def method_missing(method, *args)
    user_url    = params[:user]
    company_url = params[:company]
    context     = get_context

    case context.type
    when :user
      redirect_to user_url.gsub(":id", current_user.id.to_s)
    when :company
      redirect_to company_url.gsub(":id", context.id.to_s)
    end
  end
end

リダイレクト用の実際の URL を、それらが属する場所 (ファイル内) に保持するのは簡単で、routes.rbそのデータは DRY コントローラーに渡されます。ルートで現在のコンテキスト オブジェクトの ID を渡すこともできます。

于 2011-02-08T18:49:34.883 に答える
0

あなたのアプローチは私にとって最良の方法のようです。それ以外のものはもっと雑然としていて、あまり標準的ではありません。

于 2010-09-28T00:42:54.070 に答える