2012-04-13 25 views
9

que sigo el pragmático Agile Web Development libro con rieles 4ª Edición, pero estoy usando Rails 3.2.2 3.0.5 en vez de como se recomienda en el libro:Rails 3.2.2 rjs no ejecutar

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

Me quedé atrapado al incluir AJAX para volver a dibujar el carrito sin volver a cargar la página. Aquí está la acción de crear en 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 

Y aquí es mis archivos create.js.rjs RJS (menores app/views/line_items):

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

Sin embargo, cuando haga clic en el botón que inicia esta acción:

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

me sale el siguiente error en el registro de desarrollo:

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' 

Si cambio el nombre del archivo de create.js.rjs a create.js.erb, el problema se corrige:

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

pero no pasa nada en la vista .... ni siquiera la alerta. ¿Qué me estoy perdiendo? ¿Cuál es la diferencia entre file.js.erb y file.js.rjs?

+0

hey guy! Encontré tu publicación en google. Enfrenté la misma situación. ¿Encontraste la solución? – code4j

+0

¡Solucioné el problema! Ver mi [solución] (http://stackoverflow.com/questions/12220816/the-ajax-request-cannot-see-the-effect-without-refresh-the-browser-in-rails/12224196#12224196). Espero que esto pueda ayudarte. – code4j

Respuesta

18

Parece que rjs ha sido removed as the default como de Rails 3.1. Puede recuperarlo instalando la gema prototype-rails, pero creo que debería usar jQuery, que es el nuevo valor predeterminado.

En cuanto a su código, la razón por la que no funciona es que se trata de una plantilla rjs interpretada como .js.erb, y es probable que solo genere JavaScript no válido (debería ver errores en la consola de JavaScript de su navegador). Una plantilla rjs solía establecer la variable page y escribiría el código Ruby utilizándola para manipular su página. En una plantilla .js.erb, funciona más como en sus .html.erb vistas. Escribes JavaScript real, con Ruby incrustado usando etiquetas <% %>. Por lo tanto, el código en create.js.erb debería verse más o menos así:

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

Gracias, seguramente cambiaré a jquery entonces. –

6

En los rieles> = 3.1 ya no hay jquery-rjs. Pero se puede usar CoffeeScript aquí: line_items/create.js.coffee:

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

o algo por el estilo.

Cuestiones relacionadas