1

Ruby on Rails 3.1.3 でアプリを作成しています。さまざまなタイプのユーザー (つまり、管理者、オペレーター、広告主など) がいて、それぞれに異なるメイン (またはホーム) ページがあります。のようなものを使用して、現在ログインしているユーザーのホームページのそれぞれのルートを提供するルート ヘルパーを作成したいと考えていますhome_path。これは主に、特定のアクションの後にリダイレクトするためのものです (ユーザーのタイプに応じて、それぞれのホームページにリダイレクトしたい)。

current_user(現在ログインしているユーザーを返す)、current_user.admin?(現在ログインしているユーザーが管理者の場合は true を返す)など、いくつかのメソッドが既に利用可能ですcurrent_user.operator?

現在、これを行うためにヘルパー メソッドを使用していますが、Rails の方法とは思えません。とにかくコードは次のとおりです。

def home_path(params = {})
    user = current_user
    case user
        when user.admin?
            params = {:controller => 'administrators', :action => 'index'}.merge(params)
        when user.advertiser?
            params = {:controller => 'advertisers', :action => 'show', :id => user.advertiser_id}.merge(params)
        when user.operator?
            params = {:controller => 'callcenter', :action => 'index'}.merge(params)
        else
            params = {:controller => 'posts', :action => 'home'}.merge(params)
    end
    url_for(params)
end

.admin?これは制約のあるルートで行う必要があると思いますが、.operator?、 などのメソッドに依存する方法はまだわかりません。これに関するヘルプは大歓迎です。

4

1 に答える 1

2

これには、ヘルパーメソッドを使用するのが適切です。ただし、ビューヘルパーではなく、コントローラーに格納されるはずです。これにより、にアクセスできるようになりcurrent_userます。いくつかのクリーンアップを行うと、現在と同じアイデアで半分悪くないものに到達できます。

module DefaultHomeHelper
  DEFAULT_PARAMS = { controller: :posts, action: :home }.freeze
  ROLE_SPECIFIC_PARAMS = {
    admin: { controller: :administrators, action: :index },
    advertiser: { controller: :advertisers, action: :show },
    operator: { controller: :callcenter, :action: :index }
  }.freeze

  def home_path(params = {})
    url_for params.reverse_merge(ROLE_SPECIFIC_PARAMS[current_user.role] || DEFAULT_PARAMS)
  end
end

私は、あなたがより直接的になり、Userオブジェクトに、次々に推測するのではなく、その役割を伝えるように依頼できると仮定しました。ほぼ確実に、ユーザーでこれを呼び出しているものに対応するためにコードを微調整する必要があります。新しいハッシュ構文も使用しましたが、Ruby <1.9を実行または対応している場合は、更新する必要があります。文字列の代わりにシンボルを使用してオブジェクトとメソッドを参照するのが好きなので、アクションとコントローラー名にもシンボルを使用しました(コントローラーとアクションはオブジェクトとメソッドです)。

あなたはこれを使うためinclude DefaultHomeHelperにあなたの中で簡単なことをすることができます。ApplicationControllerを使用して、ビューで利用できるようにすることもできますhelper_method :home_path

于 2012-12-27T19:08:01.657 に答える