4

私は 3 つの独立したデバイス モデルを取得しました。つまり、3 つの異なる sign_in 画面を取得しました。そして、3 つすべてにダッシュボードがあります。

devise_for :md1
devise_for :md2
devise_for :md3

match 'md1/dashboard' => 'md1#dashboard', :via => :get
match 'md2/dashboard' => 'md2#dashboard', :via => :get
match 'md3/dashboard' => 'md3#dashboard', :via => :get

mdX が正常にサインインすると、mdX#dashboard にリダイレクトされ、可能であれば GET でリダイレクトされます。私は試した:

devise_scope :md1 do
  root :to => 'md1#dashboard'
end
devise_scope :md2 do
  root :to => 'md2#dashboard'
end
devise_scope :md3 do
  root :to => 'md3#dashboard'
end

次に、md1 で正常にサインインすると、md1 ダッシュボードにリダイレクトされましたが、md2 で正常にサインインすると、md1 の sign_in 画面にリダイレクトされました。それから私は試しました:

def after_sign_in_path_for resource
  dashboard_path resource
end

しかし、そのような方法はありません。これを行う簡単な方法はありますか、ifそれとも各モデルのステートメントを使用する必要がありますか?

アップデート

理解を深めるためのいくつかのルートと、より良い解決策を得るためのより多くの情報

md1_dashboard GET    /md1/dashboard(.:format)        md1#dashboard
md2_dashboard GET    /md2/dashboard(.:format)        md2#dashboard
md3_dashboard GET    /md3/dashboard(.:format)        md3#dashboard

前もって感謝します

4

1 に答える 1

6

これを書いているとき:

devise_scope :md1 do
  root :to => 'md1#dashboard'
end
devise_scope :md2 do
  root :to => 'md2#dashboard'
end
devise_scope :md3 do
  root :to => 'md3#dashboard'
end

同じ名前の 3 つのルート ルートを定義しています。それらは競合するため、最初のもののみが使用されます。そのため、md1 のみが機能しました。あなたはおそらくこれを書くつもりでした:

scope :md1 do
  root :to => 'md1#dashboard'
end
scope :md2 do
  root :to => 'md2#dashboard'
end
scope :md3 do
  root :to => 'md3#dashboard'
end

この場合、3 つの異なるスコープで 3 つの異なるルート ルートを定義します (rake routesもう一度確認してください)。注:scopeルートをスコープするルーター メソッドであり、devise_scopeどのルートもスコープしません。使用するデバイス スコープを単に通知するだけであり、Devise が明示的に要求しない限り、通知する必要はありません (いつ通知されるかはわかります)。

この変更後、すべてが期待どおりに機能するはずです。Devise はデフォルトで#{scope}_root_pathサインイン成功後にリダイレクトを使用することに注意してください。これが上記のコードが機能する理由です (確認すると、、 などが定義されているrake routesことがわかります)。md1_rootmd2_root

于 2012-07-28T10:42:58.783 に答える