2015-07-08 3 views
0

Я недавно читал книгу Agile на итерации E3. На этой итерации я мог «успешно» пустую корзину с правильным представлением и прошел тест, как показало учебное пособие. Однако, в rails'console, когда я проверяю Cart.all, соответствующая корзина все еще существует; когда я нажимаю http://localhost:3000/carts/1; Я видел, что все предыдущие выбранные позиции все еще существуют. Я думал, что когда вызывается destroy, тележка и соответствующая позиция должны быть уничтожены из базы данных, но, похоже, это не так. Где я неправильно понял? Может кто-нибудь объяснить, почему это произошло? Я поместил свой исходный код в github: https://github.com/WeiliangXing/depot-rails.git Также я обнаружил, что session [: card_id] равен nil, который должен иметь что-то, потому что я использую метод set_cart в LineItemController для установки сеанса current_cart. Может ли кто-нибудь помочь мне разобраться, почему?Разбита ли корзина или нет в примере в Agile Web Development с Rails 4?

+0

Не могли бы вы уточнить, что именно вы сделали? Пропустили ли вы тест, затем рельсы c => Cart.all? Это откроет консоль в среде разработки, но ваша удаленная тележка находится в тесте. – Ninigi

+0

Я запускаю тест, он прошел; Я также запускал приложение в хроме и выполнял пустую операцию с корзиной (есть пустая кнопка/carts/1), которая показала, что тележка успешно опустела и вернулась к корню; однако после этой операции, когда я набрал адрес/тележки/1, он показывает корзину, и ее элементы все еще существуют. Также я использую консоль, чтобы проверить, есть ли тележки после вышеперечисленных операций, и да, она все еще там. Я не могу объяснить, почему. – Peterxwl

ответ

1

Это очень конкретный вопрос, и я думаю, если вы просто продолжал идти через учебник, вы могли бы найти ответ сами :)

Причина, почему Ваша корзина IST еще там, потому что это не удаляться. Существует охранник, который говорит «if @ cart.id == session [: id]», который никогда не возвращает true, потому что session [: id] равен нулю.

В какой-то момент вашего приложения вы должны установить сеанс [: id], я ДУМАЮ, это должно быть в def create; ...; end, но я не читал учебник, поэтому я не хочу указывать вас на неправильный направление.

Причина, по которой ваш тест по-прежнему выглядит: вы устанавливаете сеанс [: id] в своем тесте, но никогда в своем действительном приложении.

Так, намного интереснее для вас, может быть, как отлаживать приложения рельсы:

'puts' is very usefull он будет писать вещи в вашей консоли. Итак, я сделал это:

# DELETE /carts/1 
# DELETE /carts/1.json 
def destroy 
    puts @cart.id, session[:cart_id].inspect, @cart.id.to_s == session[:cart_id] 

    @cart.destroy if @cart.id == session[:cart_id] 
    session[:cart_id] = nil 

    respond_to do |format| 
    f ormat.html { redirect_to store_url, notice: 'Your cart is currently empty.' } 
    format.json { head :no_content } 
    end 
end 

Который дал мне выход

1 
nil 
false 

Использование помещает, чтобы узнать, что делает ваше приложение, и использовать .inspect, чтобы убедиться, что такие вещи, как «ноль» будет быть выписанным, а не просто пустым пространством. .

Счастливый Coding :)

+0

Любопытно, почему сеанс [: cart_id] равен нулю? потому что я использую метод set_cart в before_action уже из LineItemController, который определен в соображениях/current_cart.rb для установки значения сеанса. Когда я нажимаю элемент для добавления; сессия должна иметь записи. – Peterxwl

+0

Я только начал набирать огромное «как избежать такого рода проблемного учебника», но, честно говоря, я не думаю, что вам это нужно, потому что вы уже делаете учебник. Вы предоставили резервную копию для случая отсутствия тележки, поэтому каждый раз, когда нет тележки, будет создан новый. Вы изменили код учебника, потому что я не могу поверить, что учебник подскажет вам сделать это ... – Ninigi

+0

Я строго следил за этим кодом в учебнике. Вы имеете в виду, что учебник содержит плохой код? – Peterxwl

0

У меня такая же проблема (В моем случае помещает предоставленный @Ninigi выводит на следующий:

Тогда я удалил to_s метод от @ cart.id.to_s == сессии [: cart_id] и получить

11 
11 
true 

Но проблема не была исправлена, из-за курса. И я подумал, что

@cart.destroy if @cart.id == session[:cart_id] 

рекурсия и я изменил уничтожить метод удалить.Теперь эта строка выглядит так:

@cart.delete if @cart.id == session[:cart_id] 

И магия сделала собственную работу) Теперь мы можем уничтожить повозку без ошибок.

Я надеюсь, что это поможет кому угодно.

Спасибо!

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