2010-11-19 11 views
30

Non ho idea del perché questo non sta funzionando, sto imparando rotaie e sto seguendo un libro che dice di farlo in questo modo:Rails form_for: a distanza => true non è chiamando il metodo js

<%= form_for([@article,@article.comments.new ], :remote=>true, :html => {:style=>'display: none;' }) do |f|%> 
    <div class="field"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :body %> 
     <%= f.text_area :body %> 
    </div> 
    <%= f.submit %> 
<% end %> 

Tuttavia non funziona, e quando controllo la richiesta in firebug l'URL non termina con .js, hai qualche idea del perché?

+0

È possibile aggiungere secondo i metodi di controllo (ad es.indice, creare, nuovo) e i relativi file di visualizzazione qui, in modo che possiamo vedere l'intera immagine? – Ingo

risposta

-11

Cambio:

[@article,@article.comments.new ] 

per

@article 

vi consiglio di leggere l'API sul relativo tratto: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

+2

ryudice sta cercando di avere un nuovo modulo di commenti per l'articolo ryudice è acceso. la forma di ryudice per la chiamata è la sintassi corretta per ciò che ryudice sta volendo. Il tuo suggerimento andrebbe bene per un modulo di articolo standard. È confusionario, perché il contesto non è mai dichiarato. – natedavisolds

32

Quando si controlla la richiesta formulata nella Firebug, solo perché l'url non si è concluso con .js, non significa che non è stato chiamato da javascript. Per verificare che è necessario controllare l'intestazione della richiesta per vedere qual è il parametro Accept. Se dice "application/javascript", allora va tutto bene.

In secondo luogo, un problema molto comune quando si inizia a provare: remote => true è che le librerie javascript richieste non sono incluse nel codice. Quindi la mia ipotesi è che il codice non è presente il layout:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

Se questo è il caso, è sufficiente includere all'interno del tag <head> del layout.

+0

intendi per "intestazione html" il tag head del modello in cui il form/link con il telecomando: true è? – Timo

+0

Sì, grazie per averlo indicato. Non era così chiaro. Ma sì, dovrebbe essere incluso all'interno di tag – DanneManne

21

Molto probabilmente ciò che accade è che ti manca il file rails.js, che gestisce quello per te, sia che tu stia utilizzando il prototipo o jquery.

Se si utilizza jQuery, il modo più semplice per ottenere tutti i file necessari è utilizzare la gemma jquery-rails. Questo aggiungerà un generatore per installare jquery e il necessario rails.js.

tipo qualcosa di simile all'interno della vostra radice dell'applicazione rails:

rails g jquery:install 

E poi, all'interno del vostro application.html.erb aggiungere la riga

<%= javascript_include_tag :defaults %> 

o esplicitamente (non dimenticate di includere il vostro jquery separatamente):

<%= javascript_include_tag :rails, :application %> 

[MODIFICA: per Rails 3.1 o versione successiva utilizzando la risorsa gasdotto]

Utilizzare il jquery-rails gemma (come detto sopra) e aggiungere le seguenti righe al app/assets/javascripts/application.js (se non sono già lì):

//= require jquery 
//= require jquery_ujs 

Spero che questo aiuti!

+0

ha funzionato bene .. Grazie .. – Neo

+0

Abbiamo avuto questo problema ma abbiamo incluso 'jquery_ujs.js' per risolverlo. –

+0

Sì, è vero, è cambiato un po 'con le rotaie 3.1 e la pipeline degli asset. Ho aggiornato la mia risposta per riflettere questo. – nathanvda

4

Controllare il controller: ha un blocco di risposta_to?

Se è stato generato l'app con rotaie generano impalcatura, avrà qualcosa come

respond_to do |format| 
     format.html 
     format.xml { .... } 
    end 

Se non ce l'ha, basta prendere l'intero blocco fuori, da respond_to alla fine; o in alternativa sostituire l'intero blocco con l'unica linea

respond_to :html, :js 

o in alternativa modificare il blocco aggiungendo la riga in più mostrato qui

respond_to do |format| 
     format.html 
     format.js 
     format.xml { .... } 
    end 

O dovrebbe funzionare nel vostro caso.

4

Controllare il file /app/assets/javascript/application.js

Va riportato qui di seguito i file in là. jquery_ujs è responsabile della funzione remote=> true.

require `jquery` 
require `jquery_ujs` 

Happy Coding !!

+1

Ho avuto un problema simile a newbie mentre seguivo 'Sviluppo Web agile con Rails', in' capitolo 11.2 Iteration F2: Creazione di un carrello basato su AJAX'. Il problema è risolto da un commento '= require jquery' nel file che hai elencato. Spero che questo aiuti le altre persone. –

+0

That's Great @cppinitiator! –

6

Questo errore si verifica quando non è stato aggiunto il file jquery_ujs. Hai appena incluso il file jquery.

Quindi è necessario aggiungere entrambi i file manualmente si visualizza o li richiedono in application.js o qualsiasi altro file che si sta utilizzando per specifiche il layout.

A seconda del tuo scenario, puoi seguire la 1a o la 2a soluzione.

prima soluzione:

<%= javascript_include_tag :jquery, :jquery_ujs %> 

seconda soluzione:

  1. richiedono sia jquery e jquery_ujs in app/Attività/application.js

    //= require jquery.js 
    
    //= require jquery_ujs 
    
  2. Includere il file application.js nello specifico file .

    <%= javascript_include_tag :application %> 
    

Nota:

aggiungere anche tag CSRF nel file di layout per entrambe le soluzioni.

<%= csrf_meta_tag %> 

Sto facendo in modo che tu abbia sotto il codice nel tuo Gemfile e abbia già installato questa gemma.

gem 'jquery-rails' 
+0

La seconda soluzione ha risolto il mio problema! –

Problemi correlati