ruby-on-rails - 如何使用单例重构包装器来设置 session ?

标签 ruby-on-rails ruby api wrapper asterisk

module Asterisk
  class Client
    include HTTParty
    base_uri 'https://asterisk.dev/'

    def initialize(session_key = nil)
      @session_key = session_key
    end

    def get_session_key(login, password)
      self.class.put('/api/auth', query: { login: login, password: password })
    end

    def get_contacts
      self.class.get("/api/#{@session_key}/contacts")
    end

    def get_contact(id)
      self.class.get("/api/#{@session_key}/contact/#{id}")
    end

    def create_contact
      self.class.put("/api/#{@session_key}/create")
    end

    def logout
      self.class.delete("/api/#{@session_key}/logout")
    end
  end
end

现在它的工作原理如下

session_key = Asterisk::Client.new.get_session_key('login', 'pass')
client = Asterisk::Client.new(session_key)
client.get_contacts

我想使用单例获取和设置 session key 。如何做到这一点?

最佳答案

module Asterisk
  class Client
    include HTTParty
    include Singleton
    base_uri 'https://asterisk.dev/'

    attr_reader :last_session_update

    private

    def session_key
      if !@session_key || session_refresh_needed?
        @session_key = set_session_key
        @last_session_update = Time.now
      else
        @session_key
      end
    end

    def set_session_key
      self.class.put('/api/auth', query: { login: login, password: password })
    end

    def password
     #the way you get pass
    end

    def login
     #the way you get login (ENV...)
    end

    def session_refresh_needed?
      return true unless last_session_update
      ( Time.now - last_session_update) > 30.minute
    end
  end
end

它包括您的问题,刷新 30 分钟。

现在调用Asterisk::Client.instance

关于ruby-on-rails - 如何使用单例重构包装器来设置 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19005338/

相关文章:

javascript - 在 Cucumber 中测试 JQuery UI slider

c# - 通过 dotnetbrowser 返回 Books json

python - 500 内部服务器错误 : Python Bottle API

json - 如何解码可变类型的 JSON 数据字段?

sql - 在 Postgres 的数组列中使用 UPCASE 或 Regexp

ruby-on-rails - 使用 Ruby on Rails 根据时间间隔发送电子邮件

ruby-on-rails - 带有Rails ajax的pushState

python - 在 Ruby 进程中嵌入 Python CLI?

Ruby: bundle 不适用于 rbenv(路径名包含空字节(ArgumentError)

ruby-on-rails - 安装 Ruby 2.2.6 时 macOS Sierra 的 RVM 问题