2017-10-25 11 views
1

私の意見では、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変数のスコープに問題がありますか?私はクラス内の複数のメソッドからアクセス可能なインスタンス変数を作成しようとしていますが、このクラスの各インスタンスには個別です。

+0

変数 'Phase'をどのように設定していますか?レンダリング時に明示的に設定できますか? – Cyzanfar

+1

あなたはちょうどjavascriptとルビーのイベントの違いを理解する必要があります。 Javascriptイベントハンドラが最初に実行され、ブラウザ上でのみ行われます。サーバーへのHTTPリクエストでルビイベントが発生した後でさえ、実際にはレールはクリックかホバーかどうか、またはhttpリクエストを受信して​​いる間は気にしません。 –

+0

正確に@maxpleaner。イベントリスナーがその情報を取得するようにするには、コントローラーバックエンドのデータをビューにレンダリングするように設定する必要があります(ブラウザーにデータを渡すだけではビューを通過できません) 。これを行うには、基本的に、htmlビューが必要な情報を出力できるようにデータを出力する必要があります。 – Cyzanfar

答えて

0

私は、2つのメソッドを順番に呼び出す方法を見つけて解決しました。私は完全にクリックリスナーに排除してしまったと直接ActionCableバックエンドのメソッドを呼び出して、クラスメソッドにそれを回すことで可能であった:

class QuizDataChannel < ApplicationCable::Channel 
    #method B: 
    def self.send_answers #self. makes it a class method 
    #... 
    #do something with phase 
    end 
end 

そして、私のコントローラで:

#method A: 
def switch_to_next_question 
    #... 
    self.phase += 1 
    if self.save 
     QuizDataChannel.send_answers 
    else 
     #... 
    end 
end 

としてあなたは最後にこれらのすべてを取り除くことができます:sleep、新しいスレッドとindex_changedフラグ。

関連する問題