2012-01-09 20 views
1

単純なシナリオ - 私は2つのボタンの両方が同じコントローラ/アクションを呼び出す。コントローラーアクションは乱数@random_numberを設定します。レール3 - 同じコントローラ/アクションを呼び出すが、2つの異なるビューの変更を呼び出す

ボタン1をクリックすると、REDに@random_numberを表示して、ビューをJS(JSを介して)に変更します。ボタン2をクリックすると、@random_numberをGREENに表示して、ビューをJS(JSを介して)に変更します。

これを行うDRY-estの方法は何ですか?レールのコントローラ/ビューレイヤーについての私の理解は、各コントローラ/アクションが対応するビューに関連付けられていることです。しかし、この場合、両方のボタンクリックに対して同じビジネスロジック(乱数を生成する)を使用したいが、その結果のビューはどのボタンがクリックされたかに依存する。

コントローラまたはアクションにボタンIDを渡し、コントローラ/アクションに関連付けられたRJSファイルのボタンIDを使用して、適切なJavaScriptを実行することです。しかし、私の腸は、これが最善の方法ではないことを私に伝えています。より良い方法がありますか?

クイックコードのサンプルは非常に高く評価されます。

ありがとうございました。

+0

あなたがそれらの回答を得るのに役立つならば、あなたはあなたの質問に対する答えを受け入れるべきです。 –

答えて

3

同じビューと同じコントローラメソッドで乱数を生成する必要があります。ただし、フロントエンドでは、javascriptまたはjqueryを使用してテストのcolorプロパティを設定する必要があります。このようなアプローチを開始するには、ajaxSuccessを調べて、jqueryのイベントバインダーをクリックします。

JavaScriptを使用しないようにするには、リンクフィールド(HTML5)にデータ値を設定する方法もあります。データ値は、生成された要求の一部としてコントローラに送信する必要があります。これは、テキストを動的に表示するときに設定する必要があります。この方法では、ビューまたはコントローラ内のコードの一部を繰り返さないようにします。

+0

私はあなたが最初の段落で説明したのと同様のことをしたいと思っていました。しかし、それは2つの質問を提起する:1)@random_numberを設定するコントローラー/アクションに対する応答は何でしょうか? 2)ajaxSuccessコールバックで@random_numberにアクセスするにはどうすればよいですか? – deruse

+0

1)レスポンスは2つのうちの1つである可能性があります。それは単に数値でも、クライアント側で操作するjavascriptでもかまいません。 2)ここでajaxで回答を取得する方法については、http://api.jquery.com/ajaxComplete/ –

+0

こちらをご覧ください。あなたはそれを見てみることができますか? http://stackoverflow.com/questions/34817690/rails-ajax-js-erb-same-route-more-actions –

2

REDまたはGREENの値を表示するだけの場合は、フロントエンドで処理しないでください(安全なものでなければ、サーバー側のテンプレートは避けることができます)。サーバー上でこれを処理して(安全にするために)、Button-1とButton-2に対して2つの異なるアクションを呼び出し、乱数を生成するコードをprivate functionに移動します。行動。クリックされた特定のボタンに基づいてrandom numberを生成するために特定の値を渡す必要がある場合は、値をprivate functionに渡してそこで処理できます。

コード例として、私はこのように扱います。

def action_for_button_1 
    @random_number = generate_random_number(args) 
    # render template to show in green 
end 

def action_for_button_2 
    @random_number = generate_random_number(args) 
    #render template to show in red 
end 


private 

def generate_random_number(args) 
    # generate the random number and return it. 
end 
+0

これはうまくいくでしょう。サーバーを呼び出す必要があると仮定して、1つのアクションでそれを行う方法はありますか? /index.htmlからのAJAXリクエストであると仮定すると、各ボタンごとに1つずつ、2つのコールバックの形式でindex.html自体にビュー更新ロジックをコーディングできますか?これは、action_for_button_1.rjs.erbおよびaction_for_button_2_rjs.erbにコールバックロジックをコーディングするのとは対照的です。これは可能ですか? – deruse

関連する問題