gpt4 book ai didi

ruby-on-rails - 在整个 Rails 应用程序中使用一个客户端实例进行外部服务

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:41 25 4
gpt4 key购买 nike

这个问题不是关于特定的外部服务,而是关于在整个应用程序中使用相同的对象以防止在每次调用时重新验证。我正在构建一个 ruby​​ on rails 应用程序,它通过 restforce 连接到 Salesforce REST API .截至目前,我在每个 Controller 内创建了一个 restforce 对象(客户端)的实例。这会显着降低我的应用程序的速度,因为它会在每次页面加载时对 salesforce 的 api 进行身份验证。

截至目前,我有一个初始化程序文件,它创建一个包含凭据(oauth token 等)的 restforce 对象。我想在整个应用程序中使用该客户端实例来加快速度。至少,我想在每个 Controller 中进行一次身份验证,以便每个方法都可以访问该对象的一个​​经过身份验证的实例。

restforce.rb(初始化文件)需要'restforce'

class RestforceClient
def restforce
client = Restforce.new :username => ENV['SALESFORCE_USERNAME'],
:password => ENV['SALESFORCE_PASSWORD'],
:security_token => ENV['SALESFORCE_SECURITY_TOKEN'],
:client_id => ENV['SALESFORCE_CLIENT_ID'],
:client_secret => ENV['SALESFORCE_CLIENT_SECRET'],
:host => ENV['SALESFORCE_HOST'],
:debugging => ENV['TRUE']
end
end

Controller 示例

def foobar
@user = current_user
client = Restforce.new
@fetchdata = client.query("select X from y")
end

def barfoo
@user = current_user
client = Restforce.new
@fetchdata = client.query("select X from Z")
end

上面的 Controller 说明了我遇到的问题。当我加载 foobar View 时,它会创建一个新的 restforce 实例。然后当我加载 barfoo View 时,它会创建一个新的 restforce 实例。无论如何,是否有一个跨 Controller 的 restforce 实例,或者更好的是,整个应用程序?

最佳答案

我认为这对您来说是更好的方法:

#config/initializers/client.rb

class RestforceClient
include Singleton

def restforce
@client ||= \
Restforce.new :username => ENV['SALESFORCE_USERNAME'],
:password => ENV['SALESFORCE_PASSWORD'],
:security_token => ENV['SALESFORCE_SECURITY_TOKEN'],
:client_id => ENV['SALESFORCE_CLIENT_ID'],
:client_secret => ENV['SALESFORCE_CLIENT_SECRET'],
:host => ENV['SALESFORCE_HOST'],
:debugging => ENV['TRUE']
end
end

# app/controllers/application_controller.rb

private

def client
RestforceClient.instance.restforce
end
helper_method :client

之后你就可以简单地使用它了:

# controller

def foobar
@user = current_user
@fetchdata = client.query("select X from y")
end

# view

<%= client.query("select X from y") %>

# other services

class MyService
def some_methods
result = RestforceClient.instance.restforce
#...
end
end

RestforceClient 只会创建一次 Restforce 实例。

如果你想在 AR 模型中使用 client 方法,你可以这样做:

# config/initializers/extend_ar.rb

module ActiveRecordExtension
extend ActiveSupport::Concern

def client
RestforceClient.instance.restforce
end
end

# include the extension
ActiveRecord::Base.send(:include, ActiveRecordExtension)

关于ruby-on-rails - 在整个 Rails 应用程序中使用一个客户端实例进行外部服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29836165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com