3

モデルで current_user にアクセスしないように教義が言っていることは知っていますが、完全には同意していません。たとえば、Rails コールバックを介してアクションが発生したときに、一連のログ関数を作成したいと考えています。または、オブジェクトに複数の人が書き込むことができる場合に、誰が変更を書いたかを単純に書きます (単一の所有者を持つメッセージとは異なります)。多くの点で、私は current_user をアプリケーションの構成と見なしています。つまり、このアプリをこのユーザーに応答させます。本当に場違いに見えるアクションではなく、モデル DSL を介してログを記録したいと思います。私は何が欠けていますか?

このアイデアはかなり洗練されていないようですモデルの current_user にアクセスします

これもそうです:http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

どうも

編集#1 したがって、私の質問は、監査/ロギングを実行できる宝石があるかどうかではありません。私は現在 paper_trail を使用しています (ただし、約 10 行の Ruby コードで同じ機能を実行できるため、それから離れています)。モデルで current_user にアクセスしてはならないかどうかが重要です。基本的には、コントローラー コードを削減し、ロジックをあるべきモデルにプッシュ ダウンしたいと考えています。これの一部は、RoR が何年にもわたって多くの機能を追加してきた、基本的にデータベース テーブルのラッパーである ActiveRecord の歴史によるものかもしれません。

4

2 に答える 2

1

達成したいいくつかの例を挙げましたが、それぞれの解決策を個別に見ていきます。

Railsコールバックを介してアクションが発生したときに一連のロギング関数を記述したい

ログに記録する方法(DBとロガーへの書き込み)によって異なります。DBにログを記録する場合は、コントローラーから適切な情報が提供される、または単にbelongs_to :userタイプを設定する別のログモデルが必要です。ロガーに書き込みたい場合は、アプリケーションコントローラーでメソッドを作成する必要があります。このメソッドは、createメソッドとupdateメソッド(またはコールバックをオンにするその他のアクション)から呼び出すことができます。

または、オブジェクトに複数の人が書き込むことができる場合に、誰が変更を書き込んだかを単に書き込む

class Foo < ActiveRecord::Base
  belongs_to :user, as: :edited_by
end

class FooController < ApplicationController
  def update
    @foo = Foo.find(params[:id])
    @foo.attributes = params[:foo]
    @foo.edited_by = current_user
  end
end

Railsのモデルが何をしているのか誤解していると思います。そのスコープはデータベースです。current_userにアクセスできない理由は、現在のユーザーがデータベースに保存されておらず、セッション変数であるためです。これはブラウザなしでは存在できないものであるため、これはモデルとはまったく関係ありません。

ActiveRecord :: Baseは、ブラウザで動作するように設計されたクラスではなく、データベースでのみ動作するクラスです。そのモデルへのインターフェースとしてブラウザーを使用していますが、モデルが文字通りアクセスできないクラスを拡張しているため、そのレイヤーはセッション変数などのブラウザー固有のものにアクセスするために必要なものです。

これは教義やスタイルの選択ではありません。これは、モデルが拡張しているクラスの制限の事実です。つまり、オプションは基本的に、他の何かから拡張するか、コントローラーレイヤーで処理するか、コントローラーレイヤーからモデルに渡すことになります。この場合、ActiveRecordはあなたが望むことをしません。

于 2012-08-14T22:47:09.753 に答える
0

あなたが示す2つのリンク(それぞれが同じアプローチを示しています)は、私がまだ使用しているアプローチに非常に似ています. current_user をどこかに保存し (実際、スレッド コンテキストが最も安全です)、オブザーバーで、監視対象のモデルに対するすべての変更の一種の監査ログを作成し、ユーザーをログに記録できます。

これは本当にクリーンなアプローチです。

より明示的でクリーンではありませんが、より MVC である代替方法は、コントローラーに監査ログを作成させ、ユーザーのアクションを効果的にログに記録し、さまざまなモデルへの影響を少なくすることです。これも役立つ可能性があり、1 つの Web サイトで両方を実行しました。コントローラーでは、現在のユーザーとアクションを知っていますが、より冗長です。

あなたの懸念は、どういうわけか、この提案されたソリューションが十分ではないか、MVC が十分でないか、または...何だと思いますか?

別の関連する質問: Rails ですべてのテーブルの完全な監査ログを作成する方法は?

また、この問題を非常にきれいに解決するaudited gemもチェックしてください。

お役に立てれば。

于 2012-08-14T23:05:01.330 に答える