Как избежать ошибки «замороженного хэша» в Rails без использования пустого цикла begin-rescue-end? - PullRequest
2 голосов
/ 09 октября 2011

У меня есть следующий метод, который вызывается через Ajax:

def decrement
    @cart = current_cart
    @line_item = LineItem.find(params[:id])
    @line_item.quantity -= 1
    if @line_item.quantity == 0
      @line_item.destroy
    end 

    begin @line_item.update_attributes(params[:line_item])
    rescue
    end
    respond_to do |format|
      format.js {@current_item = @line_item}
    end
end

Первоначально у меня был @ line_item.update_attributes (params [: line_item]) в операторе if, но это возвращало бы ошибку времени выполнения "замороженного хеша" вместо простого возврата false. Я думаю, что мой цикл begin-rescue-end абсолютно нелеп, хотя он работает, и я здесь, чтобы спросить, как правильно справиться с этой ситуацией в Rails.

1 Ответ

2 голосов
/ 09 октября 2011

Делать слепое rescue и затем отбрасывать исключение - это не способ решения проблем.Там может быть что-то не так, и вы игнорируете это, что является чрезвычайно опасной практикой.

Я думаю, что частью проблемы здесь является то, что вы потенциально уничтожаете запись, а затем изменяете ее после ее уничтожения., который является недопустимой операцией.Возможно, вы захотите указать это по-другому:

if @line_item.quantity > 0
  @line_item.update_attributes(params[:line_item])
else
  @line_item.destroy
end 

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

Вы можете использовать update_attributes! и спасти от ActiveRecord :: RecordInvalid, если есть что-то, что помешает этому сохраниться должным образом.Прямо сейчас вы игнорируете результат update_attributes, успешно или нет.

...