Как отобразить сообщение об ошибке для действия уничтожения, поскольку оно перенаправляет на действие индекса? - PullRequest
0 голосов
/ 24 февраля 2012

В модели у меня есть:

before_destroy :ensure_not_referenced_by_any_shopping_cart_item

и

def ensure_not_referenced_by_any_shopping_cart_item
  unless shopping_cart_items.empty?
    errors.add(:base, "This item can't be deleted because it is present in a shopping cart")
    false
  end
end

Когда товар присутствует в корзине, он не уничтожается (что хорошо), и я вижу ошибку, если регистрирую его в действии.

def destroy
  @product = Beverage.find(params[:id])
  @product.destroy

  logger.debug "--- error: #{@product.errors.inspect}"

  respond_to do |format|
    format.html { redirect_to beverages_url }
    format.json { head :ok }
  end
end

.. но переменная экземпляра, для которой было установлено сообщение об ошибке, отменяется, когда происходит redirect_to, поэтому пользователь никогда не видит его.

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

Спасибо!

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Я бы рекомендовал использовать флэш-сообщение для передачи информации об ошибке.

respond_to do |format|
  format.html { redirect_to beverages_url, :alert => "An Error Occurred! #{@products.errors[:base].to_s}"
  format.json { head :ok }
end

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

1 голос
/ 24 февраля 2012

Вы должны поместить ошибку во флэш-память.Примерно что-то вроде

def destroy
  @product = Beverage.find(params[:id])
  if @product.destroy
    message = "Product destroyed successfully"
  else
    message = "Product could not be destroyed"
  end


  respond_to do |format|
    format.html { redirect_to beverages_url, :notice => message }
    format.json { head :ok }
  end
end

Обратите внимание, что вам также необходимо распечатывать сообщения в файле application.html.erb.

0 голосов
/ 09 июня 2016

В Rails 4 вы можете сделать это

def destroy
  @product = Beverage.find(params[:id])

  respond_to do |format|
    if @product.destroy
      format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' }
      format.json { head :ok }
    else
      format.html { render :show }
      format.json { render json: @product.errors, status: :unprocessable_entity }
    end
  end
end
0 голосов
/ 01 июня 2016

Вы можете сделать это с двумя сообщениями, одно со статусом OK, а другое с NO OK ( unprocessable_entity , например, вот еще ).

def destroy
  @product = Beverage.find(params[:id])


  respond_to do |format|
    if @product.destroy
     format.html { redirect_to beverages_url, notice: "Product destroyed successfully", status: :ok}
     format.json { head :ok, status: :ok}
    else
      format.html { redirect_to beverages_url, alert: "Product could not be destroyed", status: :unprocessable_entity}
      format.json {head :no_content, status: :unprocessable_entity }
    end
  end
end
...