4

私は現在、訪問者がユーザー アカウントにログインしているか、アカウントを持たない訪問者であるかにかかわらず、各セッションを通じて訪問者がどこをクリックしたかを追跡する社内分析システムを構築しています。

現在、sessions_store.rb を介して行われた変更のおかげで、セッションをデータベースに保存していますが、session_id に加えて、UserAgent の詳細と訪問者の IP の両方をセッション テーブルに追加する方法を見つけようとしています。

いくつかの解決策を試しましたが、すべて失敗しました。現在の解決策が最も近いようですが、セッションの属性を更新した後も ActiveRecord::RecordNotSaved エラーが発生し続けます。

現在、アプリケーション コントローラーで before フィルターを使用しています。

before_filter :set_useragent_and_ip_in_session

  def set_useragent_and_ip_in_session
    if session
      sess = request.session_options[:id]
      @session = Session.where(session_id: sess).first
      @session.update_attributes(:ip=>request.remote_ip, :user_agent=>request.user_agent)
      @session.save!
    else
    end
  end

私は自分のビューにデバッグステートメントを挿入し、こじ開けてコードをいじりました-@sessionは有効で、@session.user_agentを適切に表示します....しかし、DBに保存するとロールバックします。

save! を使用すると、以下に加えてログに Completed 422 Unprocessable Entity が表示されます (スペースを節約するために Gist に貼り付けられます): https://gist.github.com/anonymous/8019c2426334f395a5fd

ありがとう!どんな助けでも大歓迎です。

4

1 に答える 1

0

スキーマを再考することをお勧めします。セッションは多くのリクエストに耐えることができ、リクエストごとにレコードが必要です。また、リクエスト オブジェクトからデータを移動し、それらをセッション テーブルに格納しようとしていることに注意してください。代わりに、独自の要求テーブルを作成し、必要なすべてのデータを要求オブジェクトから要求テーブルに移動する前フィルターを作成します。セッションには多くのリクエストが含まれます。

レコードが保存されない理由はわかりませんが、モデルに名前を付けることを賭けますセッションはレールと競合しています。リクエストテーブルを作成するときと同じように、SessionMeta や RequestMeta などの一意の名前を付ける必要があります。次に、SessionMeta は多くの RequestMeta を持つことができます。

于 2014-08-24T20:48:29.200 に答える