Rails中的flash[:notice]无法工作

3

我在我的控制器中有以下代码片段

  def create
    @message = Message.new(params[:message])
    @message.message = h(@message.message)
    if @message.save
       flash[:message] = "Message Sent. Thank You for Contacting Me"
    else
       flash[:message] = "OOps Something went wrong"
    end
    redirect_to :action => 'contact'
  end

当我尝试在联系表单中显示flash消息时,它没有显示出来。我查找了可能的解决方案,但它们似乎不起作用。有什么想法是出了什么问题吗?


1
这可能只是一个笔误,但检查显而易见的错误并不会有害: 在标题中,您说flash[:notice],但在您的方法中,您正在设置flash[:message]。您是否偶然在视图中期望flash[:notice]? - mtyaka
你在视图中使用什么代码来显示消息? - Anand Shah
抱歉,是视图中的flash[:message]。 - Shiv
<h1><%= flash[:message] %></h1> - Shiv
你能否将联系人操作的代码添加到问题中?还有相关的视图。 - EmFi
4个回答

16

您的控制器正在重定向到:action => 'contact'。确保呈现该操作的模板具有闪存通知输出。

<%= flash[:message] %>

此外,您可能希望使用 render :action ... 而不是 redirect_to :action .... 这样可以节省一次请求。


是的,问题在于如果我使用flash.now[:message] = "Blah Blah",那么它可以与渲染操作一起工作。但只是出于好奇,我想知道为什么它不能与重定向操作一起工作。是的,你提到的解决方案在contact.html.erb中。 - Shiv
7
flash.now仅适用于当前动作的状态,一旦您离开该状态,它就会被清除。因此,如果您需要在另一个请求中使用它,flash[..]将是您想要使用的内容。由于您正在重定向,并且flash[..]无法正常工作,我想知道您的应用程序是否存在某些会话问题。 - nowk
有趣,可能是会话问题。让我研究一下。 - Shiv
我猜这毕竟是一个会话问题。 - Shiv

5

闪存哈希表可以包含您想要保存直到下一个渲染的任何一组消息。脚手架通常使用flash[:notice]来进行通知。如果您没有使用脚手架生成Web页面,则必须在视图中添加<%= flash[:notice]%>

您正在控制器中设置flash[:message],因此除非您的视图中包含<%= flash[:message]%>,否则它不会出现在任何地方。

您可能的解决方案是将控制器中所有出现的flash[:message]更改为flash[:notice],或者在可能渲染此操作的任何视图中添加<%= flash[:message]%>


我曾经尝试将它放在我的视图中,但没有起作用。接下来,我将flash[:message]更改为flash[:notice]并将<pre><%= flash[:message]%></pre>放入视图中,但这也没有起作用。还有其他建议吗? - Shiv
我认为闪存消息即使在重定向后仍然存在。如果我错了,请纠正我。 - Shiv
可能是因为重定向而被清除了。是否显示任何重定向? - EmFi
无论您在控制器中使用哪个键,它都必须与视图中显示的内容匹配。此外,您将<%=flash[:message]%>添加到了哪些视图中? - EmFi
让我解释一下,我有一个显示联系人表单的视图联系人,操作转到同一控制器但是create方法,create的代码如上所示。除了create中的重定向之外,没有其他重定向。 - Shiv

3

并不是说你不会尝试,但如果我是你,我会做一些类似于以下的事情

<% if flash[:messsage].blank? %>
  <h1> flash hash is blank </h1>
<% end %>

如果在您的浏览器中看到“Flash哈希为空”,则知道它的含义。
编辑:来自文档的一些内容:“只需记住:它们将在执行下一个操作时消失。” 在您的控制器中尝试此操作。
flash.keep(:message) #keep the flash entry available for the next action

尝试过了,但我不明白为什么它会被清除? - Shiv

1
我最近遇到了一个情况,即闪存消息不会被保存。这种情况是在提交不包含CSRF令牌字段的表单时出现的。Rails将无法验证CSRF令牌,因此它将不会保留闪存消息。如果您正在使用普通的HTML表单,请使用form_tag助手自动为您添加此字段。
<%= form_tag '/example/url' do %>
  <input name="example">
  <input type="submit" value="Submit the Form">
<% end %>

谢谢您的回答。我希望我能多次点赞,因为我刚刚在这个问题上浪费了一个小时。 - Dagmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接