Подтвердить что ты не робот

Передача сообщений об ошибках через флеш

Каким образом можно перенаправить сообщения об ошибках при перенаправлении?

Ранее я использовал несколько подходов, но у обоих из них есть проблема.

(1) Передача всего объекта с ошибкой на flash и использование error_messages_for:

  def destroy
    if @item.destroy
      flash[:error_item] = @item
    end
    redirect_to some_other_controller_path
  end

Я обнаружил, что этот метод вызывает переполнение файлов cookie.

(2) Передача одного сообщения об ошибке:

  def destroy
    if @item.destroy
      flash[:error] = @item.full_messages[0]
    end
    redirect_to some_other_controller_path
  end

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

4b9b3361

Ответ 1

Во-первых, вы можете достичь того, что вы пытаетесь сделать, установив одно предложение.

flash[:error] = @item.errors.full_messages.to_sentence

Я думаю, вы могли бы также установить его как массив без переполнения файла cookie.

flash[:error] = @item.errors.full_messages

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

например.

flash[:error] = "We were unable to destroy the Item"

Общий шаблон как таковой.

def some_action
  if @record.action
    flash[:notice] = "Action performed successfully"
    redirect_to @record      
  else
    flash[:error] = "Action failed"
    render :action => "some_action"
  end
end

А именно, у нас есть два пути.

  • Действие выполнено успешно. Мы перенаправляем.
  • Действие не выполняется. Мы показываем страницу, запустим ошибку и имеем @record.errors для вызова error_messages_for(@record), если мы этого хотим.

Ответ 2

Flash является частью сеанса Rails, который очищается между запросами, а сеанс Rails реализован с использованием файлов cookie. (по крайней мере до Rails-2). Cookies обычно используются для хранения очень минимального количества данных, так как максимальная сумма, которую может хранить файл cookie по умолчанию, составляет 4 килобайта. Таким образом, хранение всех объектов модели может быть не очень хорошим вариантом. Для этого вы можете использовать другой магазин cookie, который позволит вам хранить большой объем данных.

Что касается второй проблемы, вы можете сохранить столько сообщений об ошибках в переменной вспышки. Как вы делали flash[:error], вы можете сделать то же самое и сохранить другие сообщения, используя другие клавиши для хранения других сообщений.

Надеюсь, что это поможет.

Ответ 3

Это то, что сработало для меня:

@item.errors.messages.map { |k,v| v }.join('<br>').html_safe

Ответ 4

Один из ответов Проверка правильности переадресации предлагает использовать новый clone_with_errors для создания мелкого клонирования экземпляра объекта модели. Я предполагаю, что это может помочь остаться ниже предела 4k; однако я могу представить, что для сложных моделей все еще могут быть проблемы, например. см. эту страницу, написанную в 2007 году, которая защищает от хранения экземпляров экземпляров модели в сеансе.

Ответ 5

Так как flash [: error] является хешем, вы можете передавать ему сообщения об ошибках с символом "< < < Оператор