0

コントローラーでグローバルにアクセスでき、使いやすいクラスまたはシングルトン オブジェクトが必要です。現在、次のlibs/ようなフォルダーに実装されています。

class User
  class << self

    @user = nil
    attr_reader :uid, :name

    def init session
      if session[:user_info].nil?
        @user = nil
      end

      @user = session_data[:user]
    end

    def signed_in?
      @user.nil? ? false : true
    end

    def guest?
      not signed_in?
    end

  end
end

User はアプリケーションの起動時に一度だけ初期化され、不適切な使用の場合は User が更新されないため、このコードは明らかに適切ではありません。多くの追加手順を実行せずにクラスまたはオブジェクトを使用する機能を節約したいが、新しい接続ごとに新しいグローバル インスタンスを用意したい。それはどのように行われるべきですか?

4

3 に答える 3

1

標準の「現在のユーザー」メソッドを作成しようとしているようです。あなたは物事を少し複雑にしていると思います。セッション情報に基づいてユーザー オブジェクトをロードし、インスタンス変数にキャッシュするだけです。このようなもの:

class ApplicationController < ActionController::Base
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

初めて呼び出すと、セッションに保存されている ID に基づいて現在のユーザーが検索されます。後続の呼び出しでは、既にロードしたユーザー オブジェクトが返されます。ユーザーがサインインしていない場合は、current_user単にnil.

于 2013-02-08T10:40:21.820 に答える
1

include SingletonUser クラス定義に追加してから、 User.instancego get user インスタンスを使用できます。

于 2013-02-08T08:30:38.710 に答える
0

これはすべてのクラスの基本クラスであるため、コードをApplicationControllerに配置します。そうすることで、すべてのコントローラーでもグローバルにアクセスできるようになります。

于 2013-02-08T08:41:17.143 に答える