エントリ毎に認証するユーザを変更する
そのままだとモデル毎に接続を設定することになるが、これでは複数のユーザがそれぞれのアカウントで接続して、それぞれの権限でエントリを編集するといったことはできない。
コードを追ってみたところ、エントリの更新などの際にはActiveResource#connectionを呼び出し、ここでActiveResorce.connectionへと委譲している様子。エントリの作成、更新ごとに接続の設定を変える程度であればここをオーバーライドするだけでできるっぽい。
ってことでやってみた。
class Entry < ActiveResource::Base self.site = "http://example.taslam.jp/entries" attr_accessor :username, :password def username=(str) @site = nil @user = str end def password=(str) @site = @connection = nil @password = str end def site unless username || password self.class.site else if @site.nil? uri = self.class.site.dup uri.userinfo = "#{username}:#{password}" @site = uri @connection = nil end @site end end def connection(refresh = false) @connection = ActiveResource::Connection.new(site, self.class.format) if refresh || @connection.nil? @connection end end
こんなかんじに。
entry = Entry.new entry.save # => ActiveResource::UnauthorizedAccess: Failed with 401 Unauthorized entry.username = 'hoge' entry.passowrd = 'password' entry.save # => true entry = Entry.find(1) entry.name = "新しい名前" entry.username = 'fuga' entry.passowrd = 'password' entry.save # => true
でも、これだとEntry.findとかでユーザを変えることはできない。
もっと良い方法があったら誰か教えて(´・ω・`)