0

我在控制器中存储查询结果时遇到问题:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#{params[:VendorTxCode]}%'").limit(1)

payments.each do |payment|
    security_key = payment.SecurityKey
end

稍后当我使用 时security_key,我收到一个未定义的错误。但是,当我在rails consoleas 中运行它时:

payments.each do |payment|
    puts payment.SecurityKey
end
#=> df4g5ds6

由于我的方法不起作用,如何将此结果存储在变量中以供以后使用?

4

4 回答 4

1

看起来您需要在每个 do 块之前定义变量。尝试将键存储到数组中,如下所示:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#
{params[:VendorTxCode]}%'").limit(1)

security_key = []
payments.each do |payment|
    security_key << payment.SecurityKey
end

然后您可以访问诸如 security_key[0] 等密钥。

于 2012-10-26T18:55:14.583 回答
0

首先,由于您将搜索限制为 1,因此您实际上不需要使用循环。做就是了:

security_key = payments.first.SecurityKey

除此之外,“稍后当我使用 security_key 时,我收到一个未定义的错误”是什么意思。你在哪里使用它?您是否在该方法中使用它?那么它应该在那里。它可能不是的唯一原因是您的查询没有返回任何内容。如果您的查询返回一个空集合,那么循环将永远不会发生,并且永远不会创建或设置变量。

试试这个:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#{params[:VendorTxCode]}%'").limit(1)

p payments.first # Will output nil if it's not there

如果你输出 nil,那么你知道这就是正在发生的事情。然后,您必须修改代码以检查 nil 并做出相应的响应/行为。

于 2012-10-26T16:00:14.363 回答
0

如果“稍后”是指从帮助程序或视图访问它,则需要将变量设为实例变量而不是 local: @security_key

于 2012-10-26T16:21:40.727 回答
0

您将 security_key 定义为do...end您传递给每个语句的块范围内的局部变量。换句话说,它在该块之外不可用。这是 Pry 控制台中的一个示例。

[4] pry(main)> (1..10).each {|number| result = number}
=> 1..10
[5] pry(main)> result
NameError: undefined local variable or method `result' for main:Object

块内定义的结果在块外未定义或可见。

[6] pry(main)> result = 0
=> 0
[7] pry(main)> (1..10).each {|number| result = number}
=> 1..10
[8] pry(main)> result
=> 10

在这里,通过首先在控制台会话范围内定义结果,我现在可以在块中看到对其所做的更改。

那有意义吗?

于 2012-10-26T16:26:27.370 回答