Railsです。Ruby on Railsでモデル内部からcurrent_userにアクセスする
質問
Ruby on Railsのアプリで、きめ細かいアクセス制御を実装する必要があります。個々のユーザーの権限はデータベースのテーブルに保存され、特定のユーザーに読み取りまたは書き込みを許可するかどうかは、それぞれのリソース (すなわちモデルのインスタンス) に決定させるのが最善であると考えました。この決定を毎回コントローラで行うのは、確かにあまりDRYではないでしょう。
問題は、これを行うために、モデルは現在のユーザーにアクセスする必要があり、以下のようなものを呼び出すことです。
. 一般的にモデルはセッションデータにアクセスすることはできませんが。
may_read
?(current_user
, attribute_name
)
現在のスレッドで現在のユーザーへの参照を保存するために、かなり多くの提案があります、例えば このブログの記事 . これは確かに問題を解決してくれるでしょう。
近隣のGoogleの結果は、Userクラスで現在のユーザーへの参照を保存するように助言しましたが、これはアプリケーションが一度に多くのユーザーを収容する必要がない人が考え出したものだと思います;)。
長い話を端折ると、モデル内から現在のユーザー(すなわちセッションデータ)にアクセスする私の願いは、私から来たものであるように感じます。 が間違っている .
どう間違っているのか教えてください。
どのように解決するのですか?
あなたの直感で
current_user
をモデルから外すというあなたの直感は正しいと言えるでしょう。
Danielのように、私は痩せたコントローラと太ったモデルに賛成ですが、責任の分担も明確です。 コントローラの目的は、送られてくるリクエストとセッションを管理することです。 モデルは、「ユーザーxはこのオブジェクトに対してyを行うことができるか」という質問に答えることができなければなりませんが、モデルが
current_user
. もし、あなたがコンソールにいたらどうでしょう? cronジョブが実行されている場合はどうでしょうか?
多くの場合、モデル内の適切なパーミッションAPIを使えば、これは1行で処理できます。
before_filters
で処理できます。 しかし、物事がより複雑になっている場合は、別のレイヤーを実装したいと思うかもしれません (おそらくは
lib/
で)、より複雑な認証ロジックをカプセル化してコントローラの肥大化を防ぎ、モデルがWebのリクエスト/レスポンスサイクルに密結合しすぎるのを防ぐために、別のレイヤーを実装したいと思うかもしれません。
関連
-
[解決済み】OS X Yosemite 10.10.5 で [Ruby on Rails] 5 をインストールすると extconf が失敗して終了コード 1 エラーになる。
-
[解決済み] Ruby on Railsのデータベースをパージまたは再作成する
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み】RailsでActiveRecordモデルとそのテーブルの名前を変更するマイグレーションはどのように記述するのですか?
-
[解決済み】Ruby on Railsの@変数について
-
[解決済み】Ruby on Railsはモデルのfield:typeを生成します - field:typeのオプションは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] Railsはsaveでモデル内の検証をスキップしますか?
-
[解決済み] サーバーはRailsで既に稼働している
-
[解決済み] ルビーオンレール モデルから明確な値を選択する
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Railsコンソール:リロード!モデルファイルの変更が反映されない?考えられる理由は何でしょうか?