17

サインアップ時にユーザーがアクセスしたサイトを保存しようとしています。現在、ApplicationControllerにbefore_filterがあります。

before_filter :save_referer

  def save_referer
    unless is_logged_in?
      session['referer'] = request.env["HTTP_REFERER"] unless session['referer']
    end
  end

次に、ユーザーが作成されると、このセッション変数をチェックしてnilに設定します。これが機能しない場合があり、このようなセッションを使用すると、意図しないことが発生する可能性があるのではないかと心配しています。誰かがより良い方法を持っていますか?または、おそらくいくつかの入力?

編集:これは私がリファラーを保存するために使用しているロジックです:

def create     
    @user = User.new(params[:user])  
    if @user.save_with(session[:referer])
    ....
end

ユーザー

def save_with(referer)
    self.referer = referer unless referer == "null"
    self.save   
end

これが機能しない理由はありますか?

4

3 に答える 3

22

あなたのアプローチには欠陥があると思います。ユーザーがページにアクセスしていて、ログインしていない限り、フィルター コードは実行されます。したがって、nil にならない唯一の方法session['referer'] (おそらく) ログイン情報を投稿するサインアップ ページに直接アクセスし、セッション変数を確認することです。

おそらく、リファラーを 1 回だけチェックする必要があると思います。これを行うには、フィルター コードを変更する必要があります。

def save_referer
  unless is_logged_in?
    unless session['referer']
      session['referer'] = request.env["HTTP_REFERER"] || 'none'
    end
  end
end

リファラーが何であるかを知りたい場合は、有効な URL または「なし」のいずれかになります。セッション中なので、完全ではないことに注意してください。別の URL に移動して戻ってきても、セッションは引き続き有効です。

于 2010-02-26T21:39:14.267 に答える
2
def save_referer
  session['referer'] = request.env["HTTP_REFERER"] || 'none' unless session['referer'] && !is_logged_in?
end

美しい ;-)

于 2010-03-09T02:17:40.357 に答える