2011-11-01 45 views
8

我不明白爲什麼我的rails視圖不能識別flash [:notice]或flash [:error]。我不斷收到有關正在呈現的局部視圖的以下錯誤。具體的錯誤是:Rails flash [:notice] always nil

ActionView :: Template :: Error(你沒有對象,當你沒有料到它! 你可能已經期待一個Array的實例 評估nil時出錯。 ):

在我的控制器我有

def index 
    @organisms = Organism.all 
    flash[:error] = "test" 
    flash[:notice] = "test" 
    respond_to do |format| 
     format.html 
     format.json { render :json => @organisms } 
    end 
    end 

在我的index.html.erb文件I呈現出的部分通過:

<%= render "shared/flash" %> 

該部分具有以下代碼。

<div id="flashes"> 

    <% if flash[:notice] %> 
    <p id="flash_notice" class="messages notice"><%= flash[:notice] %></p> 
    <%= javascript_tag "$('#flash_notice').effect('highlight',{},1000);" %> 
    <% end %> 
    <% if flash[:error] || flash[:errors] %> 
    <p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p> 
    <%= javascript_tag "$('#flash_errors').effect('highlight',{},1000);" %> 
    <% end %> 

    <% flash[:error] = flash[:errors] = flash[:notice] = nil %> 
</div> 

然而,如果代替使該部分I中<%扔=通知%>它呈現出通知。

如果我將部分代碼粘貼到index.html.erb文件的頂部,它會正確呈現。因此,我認爲我錯誤地渲染了局部視圖?

任何幫助,非常感謝。謝謝!

+1

你錯過了關鍵部分:你如何渲染局部。另外,不要在底部取消閃光燈。 Rails已經爲你做了這些。 –

+0

感謝您的信息。我添加了如何渲染部分。 –

+1

你不需要做這個<%flash [:error] = flash [:errors] = flash [:notice] = nil%> –

回答

26

不要命名您的部分閃存。 Ruby on Rails創建一個局部變量,其名稱與局部變量相同。在你的情況下,正在創建一個Flash本地變量。

將您的部分重命名爲閃存以外的其他部分,它應該可以工作。

此外,您不應該在部分底部將閃光燈設置爲零。讓Rails照顧你。

+0

命名部分「_flash」是我的問題。感謝羅伯特指出了這一點。我從來沒有想過它。 –

+0

謝謝謝謝謝謝!我從來沒有想過要麼...... – deivid

2

你要通過閃光燈部分:

<%= render 'shared/flash', flash: flash %> 

或者多一點的時間:

<%= render partial: 'shared/flash', locals: { flash: flash } %> 
相關問題