在location.reload()之后丢失闪存值

时间:2014-02-16 20:19:54

标签: javascript ruby-on-rails ajax

我有一张remote: true的表单。提交表单时,我想回复一个js,如果记录无效,则呈现错误消息,但是当保存时,我想重新加载页面,所以我使用location.reload()为了那个原因。但是,如果记录已保存,我将为flash[:notice]分配一个值,但在location.reload()执行后我将丢失该值。在location.reload()之后我有什么方法可以保留我的flash消息。如果没有,我的替代方案是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

我想你不能。替代方案之一:

您可以使用其他一些URL参数重定向,而不是location.reload()。

例如:

在控制器中:

# it's the same like location.reload() but adding 'status=success' extra parameter to url 
...
render js: "window.location = updateQueryStringParameter('#{request.referer}', 'status', 'success');"
...

JQuery的:

function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?|&])" + key + "=.*?(&|$)", "i");
  separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
} 

然后您可以根据状态参数添加过滤器来设置Flash消息:

class ApplicationController < ActionController::Base
  ...
  before_filter :check_status
  ...
  def check_status
    if params[:status]
      if params[:status] == 'sucess'
        flash[:notice] = "Success !!! Congratulations !!!"
      else
        ...
      end
      redirect_to url_for(params.except(:status)) # take away status parameter from url (if you wish)
    end
  end

也许更好的方法是在中间件或路由约束中过滤状态参数而不是控制器。

答案 1 :(得分:0)

你丢失它是因为你正在重新加载页面。

为什么需要重装?如果要显示新记录,您可以拥有一个附加或添加新记录的create.js.erb文件。