我在控制器中存储查询结果时遇到问题:
payments = Payment.select("SecurityKey").where("VendorTxCode = '%#{params[:VendorTxCode]}%'").limit(1)
payments.each do |payment|
security_key = payment.SecurityKey
end
稍后当我使用security_key
时,我收到一个未定义的错误。但是,当我在rails console
中执行此操作时:
payments.each do |payment|
puts payment.SecurityKey
end
#=> df4g5ds6
如何将此结果存储在变量中以供日后使用?
答案 0 :(得分: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]等
这样的键答案 1 :(得分: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并相应地响应/行为。
答案 2 :(得分:0)
如果“稍后”表示从帮助者或视图访问它,则需要将变量设为实例变量而不是本地变量:@security_key
。
答案 3 :(得分: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
在这里,通过首先在控制台会话范围内定义结果,我现在可以看到块内的更改。
这有意义吗?