4

私は次のことをしたいと思います:

ユーザーの IP アドレスを抽出し、できればセッション内の任意の場所に保存するbefore_filterinを定義します。application.rb

すべてのモデルで、現在のユーザーの IP を保存するオブジェクトに追加する before_create と before_update として 2 つの before フィルターを定義します。

問題:モデルでsession[]どちらにもアクセスできません。env[]私がまだ知らない標準的な解決策を手伝ってくれる人はいますか?

よろしくジェイソン

4

5 に答える 5

6

これを試して。ユーザーモデルにクラス属性アクセサーを追加します

cattr_accessor :current_ip

アプリケーション コントローラに次を追加します。

before_filter :set_current_ip

protected
def set_current_ip
    User.current_ip = request.env['REMOTE_ADDR']
end

次に、モデルで User.current_ip を呼び出すことができるはずです

current_user オブジェクトを渡すために同様のことを行います。

于 2009-09-16T15:59:38.500 に答える
1

Rails は、モデル内のセッション情報にアクセスできないように設計されているため、やりたいことがうまくできません。これは、MVC での古典的な関心の分離です。モデルは他のレイヤーとは独立して動作することを意図しており、セッションを持たない Rake やその他のシステム タスクで作業を開始すると、モデルが機能してくれることに感謝するでしょう。

cattr_accessor :current_ip

恐ろしいアプローチです。これはハックであり、その理由は明らかです。はい、うまくいくかもしれませんが、この問題に対する間違ったアプローチです。

「誰が」「何を」行ったかを IP で追跡しているため、これが発生する論理的な場所はコントローラー層です。Rails Recipes ブックで概説されているように、CacheSweepers をオーディターとして使用するなど、いくつかの方法があります。CacheSweepers はモデルを監視できますが、すべてのコントローラー情報にもアクセスできます。Rails モデルで ditry 属性を使用すると、何が変更されたかを正確に確認できます。

@user  = User.find_by_login "bphogan"
@user.login = "Brian"
@user.save
@user.changed
=> ["login"]
@user.changes
=> {"login"=>["bphogan", "brian"]}
@user.login_was
=> "bphogan"

これをあなたが持っているセッション情報と組み合わせると、かなり素晴らしい監査人ができます.

それは役に立ちますか?

于 2009-09-19T06:00:39.480 に答える
0

本当に必要なのはバージョニング プラグインです

編集: そのリンクのアーカイブ バージョン (2012 年に 404 だった): https://web.archive.org/web/20111004161536/http://ruby-toolbox.com:80/categories/activerecord_versioning.html

于 2011-02-01T12:36:24.310 に答える
0

セッションで IP を保存する場合は、applicationController で before フィルターを作成できます。このように、アクションごとにフィルターが呼び出され、IP が保存されます。

于 2009-09-16T08:55:30.417 に答える
0

authlogicは、ユーザーのログイン/セッションなどを管理するためのプラグインであり、ユーザーの IP を追跡するオプションが組み込まれています。

于 2009-09-16T08:58:03.863 に答える