将重定向推送到错误消息的最佳方法是什么?
我以前使用过几种方法,但两者都有问题。
(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
这种方式我只发送一条错误信息,如果有很多信息呢? 有谁知道更好的方法吗?
答案 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
即,我们有两条路径。
@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;来传递错误消息。操作