通过闪存传递错误消息

时间:2011-11-24 05:59:35

标签: ruby-on-rails ruby

将重定向推送到错误消息的最佳方法是什么?

我以前使用过几种方法,但两者都有问题。

(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

这种方式我只发送一条错误信息,如果有很多信息呢?  有谁知道更好的方法吗?

5 个答案:

答案 0 :(得分:68)

首先, 你可以通过设置一个句子来实现你想要做的事情。

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

即,我们有两条路径。

  1. 行动成功。我们重定向。
  2. 操作失败。我们会显示一个页面,闪现错误,如果我们愿意,可以随时@record.errors致电error_messages_for(@record)

答案 1 :(得分:2)

Flash是Rails会话的一部分,在会话中清除,Rails会话使用cookie实现。 (至少直到Rails-2)。 Cookies通常用于存储非常少量的数据,因为我认为默认cookie可以存储的最大数量为4 kbs。因此存储整个模型对象可能不是一个很好的选择。为此,您可以使用不同的cookie存储库来存储大量数据。

至于第二个问题,您可以在flash变量中存储尽可能多的错误消息。你做flash[:error]的方式,你可以做同样的事情,并使用其他密钥存储其他消息来存储其他消息。

希望这有帮助。

答案 2 :(得分:2)

这对我有用:

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

答案 3 :(得分:1)

Rails validation over redirect的答案之一建议使用新的clone_with_errors来对模型的对象实例进行浅层克隆。我想这可能有助于保持低于4k的限制;但我可以想象,对于复杂的模型,仍然可能存在问题,例如:见page written in 2007 which advocates against storing model object instances in the session

答案 4 :(得分:0)

由于flash [:error]是一个哈希值,您可以使用&#34;&lt;&lt;&#34;&#34;来传递错误消息。操作