2015-08-12 8 views
9

Ciao, sono totalmente bloccato su questo e cerco aiuto.Errore di formato sconosciuto con respond_to in Rails. Correttamente cercando di implementare il polling-to-update

Quando faccio uno spettacolo sul mio oggetto simulation Desidero che alcuni javascript inizino a eseguire il polling ogni dieci secondi, per chiamare simulation#update in modo asincrono.

voglio fare questo respond_to, come ad esempio:

def show 
    @simulation = Simulation.find(params[:id]) 
    respond_to do |format| 
     format.js 
     format.html { redirect_to simulation_url } # This causes problems 
    end 
end 

Quindi avrei un update.js.erb che fa qualcosa sulla falsariga di (scusate la CoffeeScript)

$.ajax({ 
    type: "PUT", 
    url: "/simulations/#{params}" 
}) 

$('#sim_div').html("<%= j (render @simulation) %>"); 

setTimeout(callUpdate, 10000) 
return 

posso 't ottenere questo parziale javascript da chiamare se includo il format.html javascript non viene eseguito e ottengo un errore di formato, e se io includo quella linea, quindi ottengo un errore di formato sconosciuto.

Qual è il modo corretto di procedere? Ho provato tonnellate di soluzioni usando il coffeescript nella pipeline di asset e strane include e javascript in linea per non aggiungere.

Per chiarezza il mio punto di vista è:

<%= render 'simulation' %> 

<%= link_to 'Back', simulations_path %> 

e parziale che i carichi di script e la vista è:

<div id="sim_div"> 
    <h1><%= @simulation.identifier %></h1> 
    <h4 class="offset-col-sm-1">Dimensions: <%= @simulation.x_size %>x<%= @simulation.y_size %></h4> 
    <h4 class="offset-col-sm-1">Verdict: <%= @simulation.verdict %></h4> 

    <table class="table table-bordered"> 
    <thead> 
     <tr> 
     </tr> 
    </thead> 

    <tbody> 
     <% @simulation.state.each do |row| %> 
     <tr> 
     <% row.each do |current| %>   
      <td class="text-center"><%= current %></td>   
      <% end%> 
     </tr> 
     <% end %> 
    </tbody> 
    </table> 
    <br> 
</div> 

risposta

0

Si può provare una scorciatoia come respond_to :html, :js e vedere se questo libera in su. In caso contrario, provare qualcosa di più esplicito:

def show 
    @simulation = Simulation.find(params[:id]) 
    respond_to do |format| 
    format.js { render: "some view"} 
    format.html { redirect_to simulation_url } 
    end 
end 

format.js nell'azione :show sarà di default renda show.js.erb quando spettacolo si chiama con l'Ajax. La risposta HTML sarà un reindirizzamento.

This post del blog potrebbe essere utile.

+0

Scusate questo è quello che sto facendo .. Ho quel codice in 'show.js.erb' in modo che il formato dovrebbe chiamare sia' show.html.erb' e 'show.js.erb', ma solo il html viene chiamato quando sto usando quel 'answer_to' mostrato sopra in' simulazione # show' – NNNNNNNNNNDelicious

+0

Ah ho letto male la tua domanda, modifico la mia risposta. –

+0

Quindi capisco cosa intendi, invece di eseguire il rendering di una vista, basta rendere un partial JS che ha il tuo codice e renderizza il partial html, comunque ogni volta che vado a 'show' una simulazione, ottengo una richiesta per html, non js, quindi non eseguo mai quel JS, come posso risolvere questo? – NNNNNNNNNNDelicious