私の意見では、link_to
要素 "Start Quiz!"変数 "Phase"を設定し、ユーザーを新しい静的ページにリダイレクトするコントローラーメソッド(メソッドA)を呼び出します。私のCoffeeScriptでは、このlink_to
要素のクリックをリッスンするイベントリスナーがあります。リスナーは、バックエンドで "Phase"変数を使用してsthを実行する別のメソッド(メソッドB)を呼び出します。Rails - クリックイベント - 2つのRubyメソッド間の競合状態を処理する方法?
問題:メソッドBがコントローラメソッドAで更新される前に "Phase"変数を使用しようとすることがあります。他の誰かのために使用する前に、 "Phase"変数が更新されたことを確認する最良の方法は何ですか?
私はRailsの初心者であり、どんな指摘にも感謝します。 :)
EDIT: 「フェーズは、」私は私のクイズの現在の問題を追跡するために使用する変数です。これは入力に依存しませんが、新しいページがレンダリングされるたびに増分する必要があります(これはボタンのクリックによってトリガーされます)。
EDIT2:フラグがtrueに設定されるまで、私は今、私のコントローラに「is_changed」インスタンス変数フラグを導入し、方法Bの睡眠をさせることにより、この問題を解決しようとしました :
#method B:
def send_answers
until controller.index_changed?
sleep(0.5)
end
...
do sth.
end
#method A (in controller):
def initialize
@index_changed = false
end
def index_changed?
@index_changed
end
def set_index_changed!
@index_changed = false
end
def switch_to_next_question
...
self.phase += 1
if self.save
Thread.new do
@index_changed = true
ActiveRecord::Base.connection.close
end
else
...
end
end
これは機能しません。方法Aは眠っている。これをどうやって解決するのですか?これは正しいアプローチですか?
@index_changed変数のスコープに問題がありますか?私はクラス内の複数のメソッドからアクセス可能なインスタンス変数を作成しようとしていますが、このクラスの各インスタンスには個別です。
変数 'Phase'をどのように設定していますか?レンダリング時に明示的に設定できますか? – Cyzanfar
あなたはちょうどjavascriptとルビーのイベントの違いを理解する必要があります。 Javascriptイベントハンドラが最初に実行され、ブラウザ上でのみ行われます。サーバーへのHTTPリクエストでルビイベントが発生した後でさえ、実際にはレールはクリックかホバーかどうか、またはhttpリクエストを受信している間は気にしません。 –
正確に@maxpleaner。イベントリスナーがその情報を取得するようにするには、コントローラーバックエンドのデータをビューにレンダリングするように設定する必要があります(ブラウザーにデータを渡すだけではビューを通過できません) 。これを行うには、基本的に、htmlビューが必要な情報を出力できるようにデータを出力する必要があります。 – Cyzanfar