gpt4 book ai didi

ruby-on-rails - 在另一种方法 Ruby 中访问局部变量

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

我希望了解如何访问方法 A 中的变量集,然后在方法 B 中使用该变量,以及一种重用相同代码部分然后仅更改查询的干净方法

require 'google/api_client'

module GoogleAnalytics
class Analytic

SERVICE_ACCOUNT_EMAIL_ADDRESS = ENV['SERVICE_ACCOUNT_EMAIL_ADDRESS']
PATH_TO_KEY_FILE = ENV['PATH_TO_KEY_FILE']
PROFILE = ENV['ANALYTICS_PROFILE_ID']

def google_analytics_api

client = Google::APIClient.new(
application_name: "Example Application",
application_version: "1.0")

client.authorization = Signet::OAuth2::Client.new(
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
:audience => 'https://accounts.google.com/o/oauth2/token',
:scope => 'https://www.googleapis.com/auth/analytics.readonly',
:issuer => SERVICE_ACCOUNT_EMAIL_ADDRESS,
:signing_key => Google::APIClient::KeyUtils.load_from_pkcs12(PATH_TO_KEY_FILE, 'notasecret')).tap { |auth| auth.fetch_access_token! }

api_method = client.discovered_api('analytics','v3').data.ga.get


# make queries
result = client.execute(:api_method => api_method, :parameters => {
'ids' => PROFILE,
'start-date' => Date.new(2014,1,1).to_s,
'end-date' => Date.today.to_s,
'dimensions' => 'ga:pagePath',
'metrics' => 'ga:pageviews',
'filters' => 'ga:pagePath==/'
})
end
end
end

因此,如果我运行 google_analytics_api 方法,我会返回一组分配给变量 result 的结果。

如果我想要另外 2 个单独的方法来返回不同的结果集怎么办,所以新用户和跳出率,那将是两个单独的调用来更改请求参数,不是吗?我需要重复整个方法吗?

有没有一种方法可以重构它,以便授权调用可以包含在它的 on 方法中,我所改变的只是分配给结果的请求参数?

像这样

def api_call
logic to make request
end

def new_users
api_call
# make queries
result = client.execute(:api_method => api_method, :parameters => {
'ids' => PROFILE,
'start-date' => Date.new(2014,1,1).to_s,
'end-date' => Date.today.to_s,
'dimensions' => 'ga:pagePath',
'metrics' => 'ga:newUsers',
'filters' => 'ga:pagePath==/'
})


end

虽然其中一个问题是在 new_users 方法中提供局部变量 clientresult,但这些变量可以更改为什么?带有@的实例变量?或带有 @@ 的类变量?

最佳答案

你的直觉很好-你don't want to repeat yourself ,并且有更好的方法来构建此代码。但与其共享变量,不如考虑松散连接的小块。编写能很好地完成一件事的方法,并将它们组合在一起。例如,我们可以编写一个 get_client 方法,它只返回一个 client 供其他方法使用:

protected
def get_client
client = Google::APIClient.new(
application_name: "Example Application",
application_version: "1.0")

client.authorization = Signet::OAuth2::Client.new(
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
:audience => 'https://accounts.google.com/o/oauth2/token',
:scope => 'https://www.googleapis.com/auth/analytics.readonly',
:issuer => SERVICE_ACCOUNT_EMAIL_ADDRESS,
:signing_key => Google::APIClient::KeyUtils.load_from_pkcs12(PATH_TO_KEY_FILE, 'notasecret')).tap { |auth| auth.fetch_access_token! }
client
end

它是protected 因为外部代码——Analytic 类之外的东西——不应该直接使用它。他们应该使用我们为他们提供的方法。


您还可以提供一个辅助方法来从 API 获取结果。我不熟悉查询 API,但看起来是您的 metrics 值发生了变化。所以也许是这样的:

protected
def get_result(metrics)
client = self.get_client
api_method = client.discovered_api('analytics','v3').data.ga.get

result = client.execute(:api_method => api_method, :parameters => {
'ids' => PROFILE,
'start-date' => Date.new(2014,1,1).to_s,
'end-date' => Date.today.to_s,
'dimensions' => 'ga:pagePath',
'metrics' => metrics,
'filters' => 'ga:pagePath==/'
})
result
end

现在您可以编写您的外部类可以使用的简单方法:

def new_users
get_result('ga:newUsers')
end

def total_visits
get_result('ga:pageViews')
end

如果可以,请尝试从这些方法返回简单数据。也许 total_visits 会返回 get_result('ga:pageViews')['totalsForAllResults']['ga:pageviews']。您类(class)之外的代码不必了解 GA 数据格式即可使用它。这叫做 encapsulation .

关于ruby-on-rails - 在另一种方法 Ruby 中访问局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904794/

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