2016-04-03 5 views
0

ユーザーがリンクをクリックするたびに、彼にデータの次の部分を表示します。さ毎回コントローラー内の@instance_variableを増やす

# link in a view 
<%= link_to 'Next', user_test_do_path, controller: :do, action: :list_update, user_id: 1, test_id: 2, remote: :true, [email protected] %> 

# controller and action 
class DoController < ApplicationController   
    def list_update 
    @i+=1 
    @cur_test = Test.where(id: params[:test_id]) 
    @cur_q_all = Question.where(test_id: @cur_test) 
    @cur_q = @cur_q_all[@i] 
    @cur_ans_all = Answer.where(question_id: @cur_q) 
    end 
end 

しかし、@iがインクリメントされないと常に0 私の質問に等しいまま:私はその目的のためにインスタンス変数@iを使用していますそれぞれとインクリメント@iの値を作成する方法link_toをクリックしてください?

SOLVED!これは私の最終的な作業リンクです。

<%= link_to "Next", user_test_answers_all_path(:current_i => @i), action: :list_update, controller: :do, method: :get, remote: :true %> 

答えて

0

HTTPはステートレスプロトコルです。定義によれば、

ステートレスプロトコルは、通信要求および応答の独立 対からなるように任意 前の要求とは無関係であり、独立したトランザクションとして各 要求を処理する通信プロトコルです。

したがって、基本的にlist_updateアクションは、明示的に指定するまで、以前の状態について何も知らない。あなたはここで行うことができ、他ののparamsと共に、イテレータの現在の値を渡すことです:

<%= link_to 'Next', user_test_do_path, controller: :do, action: :list_update, current_i: @i, user_id: 1, test_id: 2, remote: :true%> 

インクリメントを行うときのカウントでこれを取る:

def list_update 
    @i = params[:current_i].try(:to_i) 
    @i = @i + 1 
    ... 

remote: trueはあなたがやるべきことを意味していること成功した場合ajax提出(例えば、あなたのHTMLページのいくつかのブロックを新しいデータに置き換える)。詳細は、Working with Javascript in Railsを参照してください。

+0

ありがとうございます!それは簡単ですが、まだ動作していません - 'link_to'の' current_i:@ i'は何らかの理由でこのヘルパーを呼び出した後に 'list_update'アクションから新しい値を変更しません –

+0

実際に' 'list_update'は0のままですか? 'list_update'に何らかの' puts @ i'と 'puts params [:current_i]'を置いてそれらの値を検証できますか? 'remote:true'は何らかの' js'スクリプトを返して適切にレンダリングする必要があることに注意してください。 – twonegatives

+0

私はあなたを抱きしめましょう!私は間違いがどこにあるのか見つけました - それはlink_toヘルパーのパスにありました - ユーザーをテストページ(アクションショー)にリダイレクトしましたが、テスト/ list_updateアクションページに変更したときには –

関連する問題