1

管理画面を開いているときに、サインインしているユーザーを確認したいと思います。

このような

  • ユーザー名、サインインしましたか?
  • エルヴィス いや
  • チェット・ベイカー、いいえ
  • マイケル・ジャクソン、いや
  • ハービー・ハンコック はい
  • ジャスティン・ビーバー はい
  • devise を使用して、追跡可能な機能を追加しました

    私の移住で

    t.integer  :sign_in_count, :default => 0
    t.datetime :current_sign_in_at
    t.datetime :last_sign_in_at
    t.string   :current_sign_in_ip
    t.string   :last_sign_in_ip
    

    問題は、ユーザーがサインアウトして:current_sign_in_atand:current_sign_in_ipが nil に設定されていない場合です。

    これを自分の sessions_controller.rb に追加しました

    def destroy
        current_user.current_sign_in_at = nil
        current_user.save
        signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(current_user))
        set_flash_message :notice, :signed_out if signed_out
        redirect_to root_url
      end
    

    current_sign_in_atユーザーがサインアウトすると が更新されるようになりました。

    :timeoutable次に、 mpduleを追加しました。セッションがタイムアウトすると、current_sign_in_atnot が更新されます。

    このすべてのハッキングの後、私はうんざりし始めました: これを行うためのよりエレガントな方法を考案しませんか?

    4

    1 に答える 1

    0

    これは少し難しいです。

    ユーザーがサインアウトした場合、':current_sign_in_at' を簡単に nil アウトできます。

    セッションがタイムアウトすると、少し難しくなります。ユーザーがタイムアウト後に入力しようとするwarden.logoutと、セッションでデバイスが実行され、ユーザーは再度サインインする必要があります。ユーザーが何もしないか、ブラウザを閉じただけの場合、サーバーが認識している限り、ユーザーはまだサインインしています。

    A: クライアントのブラウザに常に env['warden'].session.last_request_at を要求する B: 'rake db:sessions:create' でセッション テーブルを作成し、これをsession_store.rb 初期化子。

    Squadlink::Application.config.session_store :active_record_store
    

    その後、より適切に制御するために、セッションはサーバー上に置かれます。

    とりあえずこれやった

    config/initializers/warden.rb

    Warden::Manager.before_logout do |record, warden, opts|
      if record.respond_to?(:logout_stamp!)
        record.logout_stamp!
      end
    end
    

    models/user.rb

    def logout_stamp!
      self.current_sign_in_at = nil
      self.current_sign_in_ip = nil
      self.save
    end
    

    そして、

    current_user.current_sign_in_at = nil
    current_user.save
    

    行は sessions_controller destroy アクションを形成します。

    ユーザーがサインアウトした場合、またはサインアウトした場合、'current_sign_in_at' と 'current_sign_in_ip' は nil に設定されます。

    それが誰かを助けることを願っています。

    于 2013-10-17T20:01:53.897 に答える