我目前正在建立一个铁路项目,该项目可以通过PagerDuty来吸引谁在线以及他们的联系信息。我有一个rails控制器,其中包含如下函数:
def findOncallInfo(arg1)
primary_query = {
'escalation_policy_ids' => ["MY_ID"],
'schedule_ids' => [arg1]
}
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/vnd.pagerduty+json;version=2',
'Authorization' => "Token token=keklolr0flc0pt3r"
}
ocresponse = HTTParty.get(
'https://api.pagerduty.com/oncalls',
:query => primary_query,
:headers => headers
)
rawtext = ocresponse.body
text = JSON.parse(rawtext)
policies = text["oncalls"]
policies.each do |policy|
oncall = policy["user"]
oncall.each do |key, value|
if key == 'id'
@oncallID = value
elsif key == 'summary'
@oncallName = value
end
end
end
inforesponse = HTTParty.get(
"https://api.pagerduty.com/users/#{@oncallID}/contact_methods",
headers: {
'Content-Type' => 'application/json',
'Accept' => 'application/vnd.pagerduty+json;version=2',
'Authorization' => "Token token=keklolr0flc0pt3r"
}
)
rawtext = inforesponse.body
text = JSON.parse(rawtext)
methods = text["contact_methods"]
methods.each do |method|
if method['type'] == 'email_contact_method'
@oncallEmail = method['address']
elsif method['type'] == 'phone_contact_method'
@oncallPhone = method['address']
end
end
@oncallfinal = [@oncallName, @oncallPhone, @oncallEmail]
end
现在,当我使用<%= findOncallInfo('MY_SCHEDULE') %>
从我的视图中调用它时,它将返回[end]之前的函数的最后一行。例如,拉起页面会显示:
["My Name", "0000000000", "my.name@myemailaddress.com"]
现在,如果我在@oncallEmail
之后添加@oncallfinal
(或代替@oncallfinal
),则会只显示电子邮件地址。
我要做的是在页面上的不同位置调用所有变量,但是当我这样做时,我收到的所有内容都是页面上的“nil”。例如:
<h1>Test</h1>
<table>
<%= findOncallInfo('MY_SCHEDULE_ID') %> #displayed only for testing purposes
<tr>
<td><%= @oncallName %></td>
<td><%= @oncallPhone %></td>
<td><%= @oncallEmail %></td>
</tr>
</table>
结果:
Test
["My Name", "0000000000", "my.name@myemailaddress.com"]
nil nil nil
有人可以透露一下我可能会在哪些地方显示错误吗?
答案 0 :(得分:1)
您无法在控制器中使用参数和/或在rails中执行操作。如果你想将一些参数/变量传递给你的动作,你可以在路线中定义它们,比如..
get 'findOncallInfo/:arg1' => 'controller_name#findOncallInfo', as: 'find_on_call_info'
然后从您的视图中,您可以使用link_to
或类似的方式调用它。
但是,在您的情况下,您只需要method
根据参数返回一些内容,这样您就可以将整个方法移动到帮助者application_helper.rb
,然后就可以得到结果。< / p>
答案 1 :(得分:1)
据我所知,控制器操作中的实例变量可供视图使用。您正在从视图中调用一个函数,这是一个不同的东西。
您有两种选择:
1)从呈现页面的控制器操作调用该函数。这将设置变量,但在您从远程服务器获得响应之前,页面将不会呈现。
2)重新编写视图代码。
行<%= findOncallInfo('MY_SCHEDULE_ID') %>
打印出从函数返回的内容,即函数。您可以将该行替换为<% oncallName, oncallPhone, oncallEmail = findOncallInfo('MY_SCHEDULE_ID') %>
,然后在视图的其余部分中使用这些变量。
理想情况下,该函数应放在视图助手中而不是控制器中。