2012-04-13 12 views
9

Sto seguenti il ​​libro Pragmatic Web Development con Rails Agile 4 ° Edizione, ma sto usando Rails 3.2.2 3.0.5 invece di come raccomandato nel libro:Rails 3.2.2 non esecuzione rjs

~$ ruby -v 
ruby 1.9.3p125 (2012-02-16) [i686-linux] 
~$ rails -v 
Rails 3.2.2 

Mi sono bloccato quando includo AJAX per ridisegnare il carrello senza ricaricare la pagina. Ecco l'action create in line_items_controller.rb:

def create 
    @cart = current_cart 
    product = Product.find(params[:product_id]) 
    @line_item = @cart.add_product(product.id) 

    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to(store_url) } 
     format.js 
     format.json { render json: @line_item, status: :created, location: @line_item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Ed ecco la mia create.js.rjs di file RJS (sotto app/views/line_items):

page.alert('NO PROBLEM HERE') 
page.replace_html('cart', render(@cart)) 

Tuttavia, quando clicco sul pulsante che avvia questa azione:

<%= button_to 'Add to Cart', line_items_path(:product_id => product), :remote => true %> 

ottengo il seguente errore nel registro di sviluppo:

ActionView::MissingTemplate (Missing template line_items/create, application/create with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}. Searched in: 
    * "/home/me/src_rails/depot/app/views" 
): 
    app/controllers/line_items_controller.rb:47:in `create' 

Se cambio il nome del file di create.js.rjs al create.js.erb, il problema viene risolto:

Rendered line_items/create.js.erb (0.4ms) 

ma non succede nulla nella vista .... nemmeno l'avviso. Cosa mi manca? Qual è la differenza tra file.js.erb e file.js.rjs?

+0

hey guy! Ho trovato il tuo post su google. Ho affrontato la stessa situazione. Hai trovato la soluzione? – code4j

+0

Ho risolto il problema !!! Vedi la mia [soluzione] (http://stackoverflow.com/questions/12220816/the-ajax-request-cannot-see-the-effect-without-refresh-the-browser-in-rails/12224196#12224196). Spero che ciò possa aiutarti. – code4j

risposta

18

Sembra che rjs sia stato removed as the default a partire da Rails 3.1. Potresti riaverlo installando la gemma prototype-rails, ma penso che dovresti usare solo jQuery, che è il nuovo predefinito.

Per quanto riguarda il codice, la ragione non funziona è che si tratta di un modello di rjs essere interpretato come .js.erb, e questo è probabilmente solo la produzione valida JavaScript (si dovrebbe vedere errori nella console JavaScript nel browser). Un modello rjs utilizzato per impostare la variabile page per te, e si scriverebbe codice Ruby che lo utilizza per manipolare la pagina. In un modello .js.erb, funziona più come nelle viste .html.erb. Scrivi JavaScript reale, con Ruby incorporato usando i tag <% %>. Quindi il codice in create.js.erb dovrebbe essere qualcosa del genere:

alert('NO PROBLEM HERE'); 
$('#cart').html("<%= escape_javascript(render(@cart)) %>"); 
+0

Grazie, passerò sicuramente a jquery. –

6

Nelle guide> = 3.1 non c'è più jquery-rjs. Ma è possibile utilizzare CoffeeScript qui: line_items/create.js.coffee:

alert 'NO PROBLEM HERE' 
$('#cart').html '<%= j render(@cart) %>' 

o qualcosa di simile.

Problemi correlati