在redirect_to上不会更新Flash

时间:2013-11-16 06:10:07

标签: ruby-on-rails

以下是我的消息控制器的操作:

 def new
     @message = Message.new 
 end 

 def create
    @message = Message.new(message_params)

    if @message.valid?

      Contactform.contact(@message.name, @message.town, @message.email, @message.content).deliver              
      redirect_to 'messages#new', flash: { success: "Sent Message" }

    else

      redirect_to 'messages#new', flash: { alert: "Message Error" } 

    end
  end

这就是我想要发生的事情:

我去了新的'路由,创建一个@message实例,并在' new'查看有一个表单,我们可以更新此消息'实例'属性。

现在,我正在按照教程进行操作,但似乎有些解决方法。当我们提交'表格,我们会自动被带到“创造”状态。动作,并创建第二个消息实例并使用旧实例属性填充。

如果属性通过消息模型的验证,则属性将传递到' Contactform'邮件的联系人'动作,传递信息。然后我们被重定向到新的'查看,并使用"已发送消息"填充闪存。字符串,我们可以看到当我们到达新的'视图。

如果属性未通过消息模型的验证,我们将被重定向到新的'查看,并使用"消息错误"填充闪存。字符串,我们可以看到当我们到达新的'视图。

实际发生的事情

除了闪光灯外,一切都很完美。一旦它成功填充了'成功'或者警告'消息,它不会改变,直到我浏览到另一个页面。然后它会在新页面上获取更新的消息,所以我认为因为我回到同一个位置,因为某些原因闪存没有更新。

尽管我们回到同一页面,我怎样才能使闪光灯正常工作?

更新

再说一次,如果我被重定向到另一个页面,它会完美运行。只是因为它是同一页面,闪存不会更新。

此外,我现在认为:仍然没有做任何事情。

<% if !flash.empty? %>  
    <% flash.each do |index, value| %>
        <div class = "alert alert-<%= index %>"> <%= value %></div>
    <% end %>
    <% flash[:error] = flash[:message] = flash[:notice] = nil %>
<% end %>

1 个答案:

答案 0 :(得分:0)

如果您希望Flash在同一请求中显示(即没有重定向),则需要使用flash.now。以下是rails docs中的解释:

  

默认情况下,向Flash添加值将使它们可用于下一个请求,但有时您可能希望在同一请求中访问这些值。例如,如果创建操作无法保存资源并且您直接呈现新模板,那么这不会产生新请求,但您可能仍希望使用闪存显示消息

见第5.2.1节http://guides.rubyonrails.org/action_controller_overview.html