2012-09-13

ActiveScaffoldを使っているときにログインユーザ情報をモデルに持ち込む方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ログインしているユーザ情報をモデルでも利用できるようにしたい場合です。

以下のような手段があるようです。
http://rails-bestpractices.com/posts/47-fetch-current-user-in-models

ActiveScaffoldを使っていれば、以下のようにcontrollerにcurrent_userメソッドを定義すれば、
modelでcurrent_userが使えるようになります。

以下のような感じです。
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  protected
  def current_user
    User.find(session[:user_id])
  end
end

app/models/aaa.rb
class Aaa < ActiveRecord::Base
  def set_user_info
    self.user_name = current_user.name
  end
end

みたいな感じです。

以下が参考になります。
http://www.ibm.com/developerworks/jp/linux/library/l-activescaffold/
https://github.com/activescaffold/active_scaffold/wiki/Security

current_userがモデルで使えるようになる処理は

lib/active_scaffold/active_record_permissions.rb
に記載されています。
ざっくりとした仕組みとしては、以下のような感じのことが行われているようです。

#モデル相当のもの
class Moo
  class << self
    attr_accessor :test_func
  end
  
  def current_user
    Moo.test_func.call
  end
end

#コントローラ相当のもの
class Con
  attr_accessor :val
  
  def set_mod_func
    Moo.test_func = proc { p "========#{@val}" }
  end
end

c = Con.new
c.val = "111"

m = Moo.new
m.current_user
NoMethodError: undefined method `call' for nil:NilClass

c.set_mod_func
m.test
"========111"


ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ
コメントを投稿