2013-05-22 7 views
7

aufrufen Ich versuche, eine JavaScript-Funktion (eigentlich coffeescript) von einem Controller in einer Rails 3.2 App aufzurufen.wie JavaScript-Funktionen von der Steuerung in Schienen

Ich bekomme einen Render and/or redirect were called multiple times in this action Fehler.

Mein Code sieht wie folgt aus:

#Model.controller 

def index 
    @models = Model.all 
    my_action if current_user.name == "Bob" #or some other general conditional 
    ...and some stuff 
    respond_to do |format| 
    format.html 
    format.js #this is needed to handle ajaxified pagination 
    end 
end 

def my_action 
    respond_to do |format| 
    format.js { render :js => "my_function();" } #this is the second time format.js has been called in this controller! 
    end 
end 


#functions.js.coffee.erb 

window.my_function = -> 
    i = xy 
    return something_amazing 

Was ist der richtige Weg ist, eine js Funktion von der Steuerung zu nennen?

+1

Ich denke, in Kaffee Sie eine Funktion wie 'erklären müssen my_function ->' (check this: http://js2coffee.org/ und versuchen Sie Ihr Kaffee-Skript, es funktioniert nicht) – MrYoshiji

+0

good spot, das ist ein Transkriptionsfehler –

+0

Ich glaube nicht, my_function wird verfügbar sein, da es nicht an das Fenster oder im globalen Namespace gebunden ist. Siehe http://stackoverflow.com/questions/4214731/coffeescript-global-variables und http://stackoverflow.com/questions/9059475/how-to-generate-global-named-javascript-functions-in-coffeescript-for -google-a –

Antwort

12

Mann, Sie haben Argument für Block verpasst. Hauptfehler.

def my_action 
    #respond_to do # This line should be 
    respond_to do |format| 
    format.js { render :js => "my_function();" } 
    end 
end 

Und MrYoshiji's Punkt ist richtig. Aber Ihr Fehler war auf der Serverseite, war noch nicht Client-Seite erreicht.

Für den Stil, ich denke, das ist in Ordnung, wenn der Js-Code ist nur eine Funktion Anruf. Wenn mehr JS-Code, ist es besser, js Vorlage

# controller 
format.js 

# app/views/my_controller/my_action.js.erb 
my_function(); 
// and some more functions. 

aktualisieren zu machen: Wie Doppel Rendering Problem beheben

Sie müssen Ihre #INDEX Rückkehr haben, wenn die Bedingung erfüllt ist, oder das Verfahren wird auch weiterhin ausführen und verursachen Rendering zweimal oder mehr. Fix es wie folgt aus:

def index 
    @models = Model.all 
    if current_user.name == "Bob" 
    return my_action 
    else 
    # ...and some stuff 
    respond_to do |format| 
     format.html 
     format.js #this is needed to handle ajaxified pagination 
    end 
end 
+0

* faceplant *, guter Punkt. Ich habe zu lange damit gespielt! Das Problem ist nicht, dass ich zwei Blöcke rufe, die rendern (eine im Index, eine in meiner Aktion) und das wirft Fehler. –

+0

Danke, das hilft sehr, und ich denke, wir nähern uns einer Lösung. Aber ich bin nicht in der Lage, dies zu beheben 'Render und/oder Redirect wurden mehrere Male aufgerufen' Fehler. Ich habe meine Frage aktualisiert, um mehr Details zur Verfügung zu stellen. Schätzen Sie Ihre Ideen –

+0

@AndyHarvey, überprüfen Sie meine Updates. –

Verwandte Themen