2013-02-20 4 views
0

Итак, у меня есть @line_items, принадлежащие @cart. Я хочу, чтобы моя корзина была пустой, не обновляя страницу. Я поставил button_to в корзину шаблонAJAX on Rails не работает для меня

<%= button_to 'Empty cart' , cart, :remote => true, :method => :delete, 
:confirm => 'Are you sure?' %> 

уничтожить метод в carts_controller

def destroy 
    @cart = current_cart 
    @cart.line_items.destroy 
    session[:cart_id] = nil 
    respond_to do |format| 
    format.html { redirect_to(store_url, :notice => 'Your cart is currently empty') } 
    format.js 
    format.xml { head :ok } 
    end 
end 

и destroy.js.erb

$('#cart').html("<%= escape_javascript(render(@cart)) %>"); 

Работает только после освежения. Полагаю, когда кнопка нажата, тележка опустеет, поэтому, когда рельсы визуализуют @cart, она должна быть пустой. Может, у меня что-то не так?

+0

Вы проверили свой AJAX op с помощью панели инструментов разработчика в своем браузере? Убедитесь, что его параметры в порядке, это POST-операция, она возвращает HTTP-код 200, и любые результаты (например, в XML) верны. – halfer

+0

Вы должны добавить 'format.js' над строкой' format.html ... '. – mccannf

+0

На самом деле у меня есть формат.js в моем коде, извините, я только что опубликовал версию, когда я попытался это сделать с помощью контроллера line_items. –

ответ

0

Ok, я нашел 2 пути решения проблемы

1), который я считаю, лучше, добавив: зависимый =>: уничтожить

has_many: line_items, :dependent => :destroy 

к cart.rb моделируют

2) Путь с вызовом метода Cart.new in destroy

0

После того, как действие уничтожения называется объектом @cart, возможно, nil (если вы получаете текущий_cart по сеансу [: cart_id]), ваш частичный JS не сможет отобразить его правильно. В любом случае, вы должны действительно проверить свой development.log, чтобы узнать, что на самом деле происходит там.

+0

, как мне грустно, это работает, если метод уничтожения также создает новую пустую корзину после уничтожения предыдущей, но мне просто интересно, хорошо ли это решение? Думаю, вы правы, после уничтожить это nill –

+0

Если вы удаляете запись в БД для тележки и создаете другую, это не очень хорошо для решения, потому что вы хотите ПОРОЖАТЬ корзину (удалить все строки), а не уничтожить ее. – adrianrubio

+0

Фактически C art.new не создает новую корзину из-за различий между «новыми» и «создаваемыми» методами. Не думайте, что это важно для пользователя, но я также не считаю это решение хорошим. –

Смежные вопросы