在Rails视图中使用变量值

时间:2017-06-10 04:56:55

标签: ruby-on-rails ruby

我目前正在建立一个铁路项目,该项目可以通过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

有人可以透露一下我可能会在哪些地方显示错误吗?

2 个答案:

答案 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') %>,然后在视图的其余部分中使用这些变量。

理想情况下,该函数应放在视图助手中而不是控制器中。