2011-11-24 95 views
26

將重定向推送到錯誤消息的最佳方式是什麼?通過閃存傳遞錯誤消息

我以前使用過幾種方法,但他們都有問題。

(1)與誤差傳遞整個對象上閃光並使用error_messages_for:

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

我發現,此方法會導致餅乾溢出。

(2)傳遞一個錯誤信息:

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

這樣,我只發送一個錯誤信息,如果有很多? 有沒有人知道更好的方法?

回答

61

首先, 您可以通過設置單個句子來實現您想要做的事情。

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)
+0

絕對好用!謝謝! – alexs333

+2

對於您示例的'其他'部分,您應該使用 'flash.now [:error] =「Action failed」 請參閱:[the-flash](http://guides.rubyonrails.org/action_controller_overview .html#the-flash) – Joris

0

由於閃存[:錯誤]是一個哈希,你可以傳遞錯誤信息將其與「< <」運營商

2

Flash是它的請求中清除和Rails會話的實現了Rails會話的一部分使用cookies。 (至少直到Rails-2)。 Cookies通常用於存儲非常少量的數據,因爲默認cookie可以存儲的最大數量是4 kbs,我認爲。因此存儲整個模型對象可能不是一個很好的選擇。要做到這一點,你可以使用不同的cookie存儲,這將允許你存儲大量的數據。

至於第二個問題,您可以在閃存變量中存儲儘可能多的錯誤消息。你的方式flash[:error],你可以做同樣的事情,並存儲其他消息以及使用其他密鑰來存儲其他消息。

希望這會有所幫助。

2

這是對我工作:

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

在我看來這應該被標記爲答案。 –

+0

這裏使用'html_safe'可能是不安全的(針對XSS打開),這取決於您的錯誤消息的生成方式。謹慎使用... – PinnyM