エントリ毎に認証するユーザを変更する

そのままだとモデル毎に接続を設定することになるが、これでは複数のユーザがそれぞれのアカウントで接続して、それぞれの権限でエントリを編集するといったことはできない。

コードを追ってみたところ、エントリの更新などの際には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とかでユーザを変えることはできない。

もっと良い方法があったら誰か教えて(´・ω・`)