2016-04-13 10 views
1

Piggybacking off this question私はもう一度尋ねました。私のアプリでは、日付のスクロールのようなものがあります。 URL構造が/firefighter/dashboard/11-08-2016ようになっているので、あなたがログイン時に、その特定の日付を見てみたい場合、私は実際にユーザーを救う「タイプ」とそのボタンのコードは次のようになります。ログインしたユーザーがURLのベースを変更すると、

a.button href="/#{session[:user_type]}/dashboard/#{yesterday}" 

これは恥ずかしいと思われます間違っているが、多くのユーザーが多くのページを共有しているが、異なる権限を持っていると本当に私を捨ててしまう。私はそれが狂っていないようにそれをリファクタリングしたいと思います。

代わりに、1人のユーザーごとにメニューを部分的にすることはできませんでしたか?

ありがとうございます!

+0

消防士、チーフ、キャプテンのモデルはどのように違うのですか?通常、ユーザーモデルは1つで、書面による属性を使用してユーザーの「種類」を区別します。 –

+0

@PetrGazarovそれらはすべてUserクラスから継承されていますが、それぞれに個別のダッシュボード、アカウントオプション、設定などがあります。ルートを整理してそのような混乱を避ける方法はわかりません。 –

+0

また、特定の状況に応じてパスヘルパーを記述することもできます。たとえば、current_user_dashboard_path 'link_to 'Dashboardへのリンク'、current_user_dashboard_path(昨日)'などです。ヘルパーの中には、現在誰がログインしているのかを調べ、適切なURLを返すことができます。 –

答えて

1

あなたの質問を理解している限り:あなたは役割固有のURLを作成しようとしています。
私は通常、役割を維持するためにgemを使用し、その機能を使用して自分のコードでそのユーザーの役割を見つけました。

あなたはこのような何か行うことができます:

1)を使用すると、モデルのユーザーに作成していると仮定すると、これによりアプリ/ライブラリ/ dynamic_router.rbを作成

class DynamicRouter 
    def self.load 
    ComingSoon::Application.routes.draw do 
     User.all.each do |pg| 
     puts "Routing #{pg.roles.first}" 
     get "/dashboard", :to => "#{pg.roles.first}#dashboard", :as => "#{pg.roles.first}_dashboard" 
     end 
    end 
    end 

    def self.reload 
    ComingSoon::Application.routes_reloader.reload! 
    end 
end 

すべてのあなたからのダッシュボードを呼び出すことができます次のようなロール: firefighters_dashboard_pathまたはpolice_dashboard_path。

2)UserControllerでは、あなたの動的なルータについて知ってみましょう:

class UserController < ActiveRecord::Base 

    before_action :reload_routes 

    def reload_routes 
    DynamicRouter.reload 
    end 
end 

3)ダイナミックルートの生成を取得するには、config/routes.rbをファイルには、上の呼び出しでキャッチすべてのルートを置き換えるために編集されましたDynamicRouter.load

ComingSoon::Application.routes.draw do 
    root 'home#index' 
    get 'not_found' => 'users#not_found' 
    DynamicRouter.load 
end 

私はからの基準をとっている - あなたがそこに詳細を見つけることができhttp://codeconnoisseur.org/ramblings/creating-dynamic-routes-at-runtime-in-rails-4

こちらがお役に立てば幸いです。

0

あなたの質問に答えられるかどうかは分かりませんが、私が正しく理解していれば、ルート/コントローラを乾燥/リファクタリングしようとしています。

Rails.application.routes.draw do 

    POSSIBLE_ROLES = ['firefighter', 'chief', 'captain'] 
    scope "/:role", defaults: {role: 'firefighter'}, constraints: { role: /#{POSSIBLE_ROLES.join("|")}/ } do 
    get "/foo", :to => "controller#action", :as => :foo 
    end 

end 

をルートヘルパーは次のように動作します:私は次のようなルートを整理したい

foo_path # -> /firefighter/foo 
foo_path(:role => 'chief') # -> /chief/foo 
foo_path(:role => 'something') # throws ActionController::UrlGenerationError 

あなたはparams[:role]を経由して、あなたのコントローラの現在の値にアクセスすることができ、あなたが特定のことだけを感じることができます有効な値が渡されます。

編集:

それは/something/fooのようなURLを呼び出すことも、ルーティングエラー(404)をもたらすことは、おそらく、言及する価値があります。

0

私は2つの前提を設定します。これらは両方とも真でない場合は、おそらく後のアドバイスが超便利ではありません。

  • ユーザーのあなたの異なった役割は変化がある場合は一般は、
  • 同じように動作ダッシュボードと他のページを持っていますこれは、一部のユーザーが他のユーザーが使用していないことが可能で、他のユーザーが表示していない別のコンポーネントが表示されているユーザーの数が多いためです。

この場合、簡単な役割&特典システムでうまくいくと思います。ユーザーは多数の役割を持つことができ、各役割には多くの特権が関連付けられています。したがって、ユーザーには特定の権限セットがあります。

これを念頭において、特定のユーザーのみが使用できるビューのコンポーネントを取り出し、パーシャルに配置し、そのパーツを使用する権限があるかどうかをチェックする条件でラップします。一般的には、ユーザーが特定の特権を可能な限り持っているかどうかを確認することをお勧めします。そうすれば、他の場所で1トンのロジックを壊すことを心配することなく、ロールに関連付けられた権限を自由に変更することができます。

アクセスが制限される特定のコントローラアクションがある場合は、before_actionメソッドを使用して、続行する前にユーザーに正しい権限があることを確認できます。

このようなアプローチは、ルートファイルをきれいに保つのに役立ち、コントローラーやビューに不要な重複がないようにします。

0

この状況では、単一責任原則がDRYより優れています。 各ロールのルートと異なるインターフェイスに名前空間を使用します。

namespace :firefighter do 
    resource :dashboard, only: :show, controller: :dashboard 
end 
namespace :chefs do 
end 

「app/views/shared」のパーシャルに移動することもできます。日付はパラメータとして使用され、ルートでは使用されません。 コードは動的ルートよりも理解しやすくなります。

関連する問題