5

User と Business の 2 つの Devise モデルがあります。両方が単一のサインイン フォームを使用してサインインできるようにしたいと考えています。私はバックボーン js を使用しており、カスタマイズされたビューを持っているので、ビューは問題ではありません。ログインには ajax リクエストが使用されます。ユーザーには期待どおりに機能しますが、ビジネスには機能しません。

私はグーグルを検索し、これを解決するためにSTIを使用することについて言及しているいくつかのソリューションに出くわしましたが、プロジェクトは非常に完了しており、現在そのような変更を行うことはできません. 私は、Devise セッション コントローラーをオーバーライドする方向に沿って考えていました。

  1. 指定されたメール アドレスがユーザーかどうかを確認し、Warden を使用してユーザーを認証します。
  2. その電子メールを持つユーザーが見つからない場合は、Warden を使用してビジネス モデルで認証します。

上記を実現するためにコードを変更する方法がわかりません。ワーデンがどのように機能するか、上記を実現するためにどのパラメーターを調整する必要があるか、どの関数を呼び出す必要があるかわかりません。誰かが私を正しい方向に向けたり、これをどのように進めるべきかの例を提供できますか.

ありがとう。

4

3 に答える 3

7

心配する必要はありません。

あなたの最善の選択肢は、Devise のセッション コントローラーをオーバーライドし、セッションの「新規」メソッドと「作成」メソッドを変更することだと思います。

したがって、独自の「sessions_controller.rb」には、次のようなものがあります。

class SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  def new
    resource = build_resource(nil, :unsafe => true)
    clean_up_passwords(resource)
    respond_with(resource, serialize_options(resource))
  end

  # POST /resource/sign_in
  def create
    resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end
end

ルートでは、次のようなものを使用します (ユーザー モデルの名前に応じて):

devise_for :users, :controllers => {
    :sessions => 'sessions'
}


devise_for :businesses, :controllers => {
    :sessions => 'sessions'
}

上記のセッション コントローラーはまったくカスタマイズされていません。私はあなたのコードを知らないので、本当に助けられません。ただし、基本的な手順は次のとおりです。

  1. auth_optionsおよび変数を調べresource_nameて、データがどのように格納されているかを理解します。
  2. resourceユーザー テーブルに が見つからない場合は、これらの変数を変更する条件付きロジックを追加します。

Devise は素晴らしいもので、Roles も素晴らしいものですが、1 つの User モデルを使用したり、STI を使用したりするだけでは意味がない場合があります。最近のプロジェクトでこの問題を扱ったので、この正確な問題についてはすぐに長い記事を書きます。

于 2012-09-27T01:38:36.707 に答える
4

User モデルのみを使用することを検討し、CanCanRolifyを使用して、各タイプのユーザー固有のニーズに対応します。コードの一部を最初からやり直す必要があるかもしれませんが、長期的には保守が容易になる可能性があります。

私の言葉を鵜呑みにしないでください。これは、適切な回答のある関連する質問です。

于 2012-09-24T01:10:15.807 に答える