2016-04-03 9 views
0

Jedes Mal, wenn der Benutzer auf einen Link klickt, möchte ich ihm den nächsten Teil der Daten anzeigen. Ich bin eine Instanzvariable @i zu diesem Zweck verwendet:@instance_variable im Controller jedes Mal erhöhen

# 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 

ist jedoch @i nicht erhöht und bleibt immer gleich 0 Meine Frage lautet: Wie Wert von @i mit jeweils erhöht, um klicken Sie auf ein link_to ?

Gelöst! Dies ist meine letzte Arbeit link_to:

Antwort

0

Das Problem ist, dass HTTP ein Stateless-Protokoll ist. Laut Definition

ein zustandsloses Protokoll ist ein Kommunikationsprotokoll, das jede Anforderung als unabhängige Transaktion behandelt, die jede vorherige Anforderung nicht in Beziehung steht, so dass die Kommunikation von unabhängigen Paaren von Anforderungs- und Antwort besteht.

Also im Grunde list_update Aktion weiß nichts über seinen vorherigen Zustand, bis Sie es explizit angeben. Was Sie hier zu tun ist Ihren aktuellen Wert von Iterator passiert zusammen mit anderen params:

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

Und diese Zählung zu nehmen, wenn Schritt tun:

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

Beachten Sie, dass remote: true bedeutet, dass Sie tun sollen etwas auf der erfolgreichen ajax Vorlage (zB ersetzen Sie einige Blöcke Ihrer HTML-Seite mit neuen Daten). Weitere Informationen finden Sie unter Working with Javascript in Rails.

+0

danke! Es sieht einfach aus, aber funktioniert immer noch nicht - 'current_i: @ i' in' link_to' verändert den neuen Wert nicht von der Aktion 'list_update' nachdem dieser Helfer aus irgendeinem Grund aufgerufen wurde –

+0

meinst du eigentlich diesen Wert von' @ i' drin 'list_update' bleibt gleich 0? Könntest du irgendeine Art von 'puts @ i' und' puts params [: current_i] 'in' list_update' platzieren, um ihre Werte zu verifizieren? Beachten Sie, dass 'remote: true' bedeutet, dass Sie eine Art' js'-Skript zurückgeben und es richtig rendern sollten. – twonegatives

+0

Lass mich dich umarmen !!! Ich fand, wo war mein Fehler - es war in den Pfad in link_to Helfer - ich leitete Benutzer auf die Testseite (Action-Show) umgeleitet, aber wenn ich es zu test/list_update Aktionsseite änderte es begann zu arbeiten –

Verwandte Themen