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

do...end各ステートメントに渡すブロックのスコープ内で security_key をローカル変数として定義しています。つまり、そのブロックの外では使用できません。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 に答える
0

「後で」ヘルパーまたはビューからアクセスすることを意味する場合は、変数を local: ではなくインスタンス変数にする必要があります@security_key

于 2012-10-26T16:21:40.727 に答える