2

Devisegemは認証に使用されます。

Railsセッションはデータベースに保存されます。

Rails 3の外部でセッションを使用するために、というモデルを作成しましたSession。テーブルuser_idに列を追加しました。sessions

ユーザーがサインインしたらuser_id、セッションテーブルの列を更新する必要があります。だからApplicationController私はメソッドを追加しました:

  protected
  def after_sign_in_path_for(resource)
    @session = Session.find_by_session_id(request.session_options[:id])
    @session.update_attribute(:user_id, current_user.id)
    stored_location_for(resource) || root_path if @session.save
  end

しかし、リダイレクトの直後に、最近のものsessionが破棄され、DB内の別のセッションが空白になってしまいますuser_id

user_idログインに成功したときに一度書き込むのに最適な方法は何ですか?

4

1 に答える 1

1

José Valim (Devise の) は次のように答えました。

Rails 3.1 以降、Warden はユーザーのサインイン時に :renew オプションを設定し、古いセッションを強制的に破棄して新しいセッションを作成します。

だから私がやったのは、update_sessionでフィルターを作成することApplicationControllerです。

  before_filter :update_session

  protected
  def update_session
    if user_signed_in?
      @session = Session.find_by_session_id(request.session_options[:id])
      @session.update_attribute(:user_id, current_user.id)
    end
  end

sessionsRails は DB クエリをキャッシュするため、テーブルからセッションを取得するための実際の SQL 呼び出しはありません。すでに記憶に残っています。更新についても同様です。user_idRails は初回のみ更新されます。それ以外の場合UPDATE、クエリは DBMS に送信されません。

于 2012-02-11T14:14:11.037 に答える