Ajax y ruby on rails

Z

Si tengo este metodo el el controlador cart_controller;

class CartController < ApplicationController

....


def clear
    if request.xhr?
      @cart.cart_items.destroy_all
      flash[:cart_notice] = "Carro Vaciado."
      render :controller => 'cart', :action => 'clear_with_ajax'
    elsif request.post?
      @page_title = 'Vaciar Carro'
      @cart.cart_items.destroy_all
      flash[:cart_notice] = "Carro Vaciado."
      redirect_to :controller => 'catalog'
    else
      @page_title = 'Vaciar Carro'
      render :controller => 'cart', :action => 'clear', :template => 'cart/clear'
    end
  end

end

y en la carpeta views/cart ,tengo el fichero clear_with_ajax.js.erb y el parcial _cart.tml.erb ,con este codigo

<h3>Su carro de la compra</h3>
<p>
  <strong>
    <% unless controller.controller_name == 'checkout' %>
      <%= link_to 'Proceder a realizar la compra', :controller => 'checkout' %>
    <% end %>
  </strong>
</p>
<ul>
  <% for item in @cart.cart_items %>
    <li id="cart_item_<%= item.box.id %>">
      <%= render :partial => 'cart/item', :object => item %>
    </li>
  <% end %>
</ul>
<p id='cart_total'><strong>Total: <%= sprintf "%0.2f €", @cart.total %></strong></p>
<% unless @cart.cart_items.empty? %>
  <p id='clear_cart_link'>
  <b><%= link_to 'Vaciar carro', :controller => 'cart', :action => 'clear' , :remote => true %></b>
  </p>
<% end %>

Cuando le doy al enlace de Vaciar carro,no hace nada,si quito el remote=>true y se hace una peticion post si que va pero con ajax no hay manera.

MTX_Anubis

Lo mejor sería hacer estos cambios:

render :controller => 'cart', :action => 'clear_with_ajax'

por esto

render :clear_with_ajax

Has comprobado que el request es XHR realmente? Quizá no te esté entrando ahí y te entra en el ultimo else. Y separa las acciones que vayas a hacer en diferentes métodos. Es decir, el GET a #clear no puede ser el mismo método que el POST o PUT a #clear. Deberían ser métodos distintos (que redireccionas en el routes).

Por ejemplo, algo así:

    resources :cart do
      get 'clear'
      post 'clear', to: "cart#delete_cart"
    end

De hecho, es que si Cart es el controlador de tu carro, deberías usar el REST con los métodos por defecto que quieras (GET/PUT/DELETE o GET/POST si quieres ser purista) pero ahí ya no me meto :P. También, en el propio controlador no te hace falta distinguir cómo es la petición ya que siempre haces lo mismo y por defecto va a intentar renderizar la vista que tenga el mismo nombre que la acción con el formato de la petición. Vamos que si me haces caso te quedaría así:

def delete_cart
      @page_title = 'Vaciar Carro'
      @cart.cart_items.destroy_all
      flash[:cart_notice] = "Carro Vaciado."
end

Y tus vistas quedarían con estos nombres (la primera sería para el GET #clear)

views/cart/clear.html.erb
views/cart/delete_cart.js.erb
views/cart/delete_cart.html.erb
Z

Gracias,ya lo solucione

1 respuesta
DarkSoldier

#3 y la solución es....

Z

era un error en el js.erb

Usuarios habituales