2011-11-01 44 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 } %> 
相关问题