1

問題

User モデルと、User モデルを継承する Volunteer モデルがあります。

class User < ActiveRecord::Base
end

class Volunteer < User
end

どちらもデータベースの同じテーブルに保存されますが、コントローラー/ルートが異なります。

ルートは次のとおりです。

devise_for :users ....
devise_for :volunteers ....

これはうまく機能しますが、私が使用する認証システムはcurrent_userヘルパーに依存しています。Devisecurrent_volunteerは Volunteer モデル用に作成するため、これはボランティアには失敗します。

私が試したのは setdevise_for :volunteers, :singular => "user"で、これによりユーザーとボランティアを参照する current_user が作成されますが、現在の問題は、ボランティアのルートがめちゃくちゃになっていることです。

質問

私の質問は、current_userユーザー以外の別のモデルをヘルパーに参照させる方法はありますか?

4

4 に答える 4

4

このようにして、ユーザーが同じセッションでユーザーとボランティアとしてサインインできるようにすると思います。

それに対処する方法があれば、ただ持つことはできません

# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
  devise_current_user || current_volunteer
end

あなたのapplication_controller.rbで

于 2012-05-11T10:15:52.137 に答える
0

私はviktortronの答えを受け入れました。なぜなら、それが最もクリーンな方法のように思われるからです。

しかし、私は別の方法で問題を解決しました。

他のクラスのサインインプロセスをとしてハードコーディングすることになりました:usercurrent_userこれにより、ボランティアクラスでもメソッドにアクセスできます。

class Volunteers::SessionsController < Users::SessionsController

  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
    if resource
      flash[:notice] = "You are logged in"
      sign_in(:user, resource)
      super
    else
      super
    end
  end

end
于 2012-05-29T10:11:25.540 に答える
0

私も同様の問題に直面し、このように解決しました。しかし、このソリューションはカンカンジェムに固有のものですか。

application_controlller.rb

def actual_user
  @actual_user ||= current_user.present? ? current_user : current_volunteer
end

def current_ability
  @current_ability ||= Ability.new(actual_user)
end
于 2012-05-11T11:49:55.647 に答える
0

おそらく少し遅くなりますが、routes.rbで次のことを試すことができます

devise_for :users , :skip => :registrations
as :user do
    match "volunteers/edit(.:format)", :to => "devise/registrations#edit"
end
devise_for :volunteers , :skip => :sessions

上記のコードは、すべてのユーザーとそのサブクラス (ユーザー モデルの階層を実現するために STI を実装していると仮定) がサインインおよびサインアウトできることを前提としていますが、登録できるのはボランティアのみです。ボランティアはユーザーであるため、ユーザーは自分の登録を編集できる必要があります。as :user ブロック内にさらにルートを追加できます。

于 2012-11-22T07:51:59.493 に答える