当前位置: 首页 > 面试题库 >

在ajax调用后,Rails不显示flash消息

慕云
2023-03-14
问题内容

我正在编写Rails 4.0.2应用程序,并试图在AJAX事件发生后在我的视图中显示Flash通知。

在我看来,我会显示一个日历,其中包含用户可以点击的天数。当他们这样做时,我会通过onclick事件处理程序触发AJAX事件,该事件处理程序会更新我的模型(添加或删除记录)。触发事件后,我将完成页面刷新以显示更新的结果。

我发现我必须在JS click事件期间进行页面刷新,以使视图正确更新。仅在控制器中进行重定向或渲染是不够的。

因此,为此,我在控制器中设置了Flash通知…

def set_conflicts
  @conflict = @member.conflicts.for_date(params[:date]).first

  if @conflict
    @conflict.destroy
  else
    conflict_date = Date.parse(params[:date])
    unless Conflict.create(
        month: conflict_date.month,
        day:   conflict_date.day,
        year:  conflict_date.year,
        member: @member
    )
      flash[:alert] = 'Oops, there was a problem updating conflicts'
    end
  end
  flash[:notice] = 'This is a test!'
  redirect_to manage_member_conflicts_path(@member)
end

…并且在我的 application.haml中 包含以下闪光灯显示逻辑…

...
%body
  = p flash.inspect
  - flash.each do |type, message|
    = content_tag(:div, message, :class => "flash-#{type}")

  = render 'devise/menu/login_items'
  = yield

注意:我在视图中使用HAML而不是ERB

但是,无论我如何尝试,都不会显示Flash消息。 除了 Flash消息 之外 ,其他一切都可以正常进行,我还无法弄清楚 原因

我怀疑这与AJAX刷新(与重定向(甚至可能是Turbolinks)结合在一起)有关,但是我在SO上浏览了其他答案,因此无法正常工作。显然,我缺少了一些东西。

这是JS点击处理程序(非常简单):

window.calendarClick = (eventDate, linkURL) ->
  event = $(document.getElementById(eventDate))
  event.toggleClass('selected')

  # Set or Remove conflicts
  $.ajax
    url: linkURL
    data:
      date: eventDate

  # Refresh the page
  $.ajax
    url: '',
    context: document.body,
    success: (s,x) ->
      $(this).html(s)

问题答案:

Ajax

我会认真考虑您的Ajax刷新过程。刷新整个页面效率极低,我认为涵盖了更深层次的问题

为什么不尝试使用该.js.erb文件views夹中的文件来通过该方法直接处理JS:

def set_conflicts
  @conflict = @member.conflicts.for_date(params[:date]).first

  if @conflict
    @conflict.destroy
  else
    conflict_date = Date.parse(params[:date])
    unless Conflict.create(
        month: conflict_date.month,
        day:   conflict_date.day,
        year:  conflict_date.year,
        member: @member
    )
      flash[:alert] = 'Oops, there was a problem updating conflicts'
    end
  end
  flash[:notice] = 'This is a test!'

  respond_to do |format|
      format.html { redirect_to manage_member_conflicts_path(@member) }
      format.js 
  end
end

#app/views/controller/set_conflicts.js.erb
$("#your_element").html(<%=j render manage_member_conflicts_path(@member) ) %>);

响应

尽管我不确定这一点,但我知道Flash对象是由ActionDispatch ::
Flash
中间件处理的。我认为XHR不能像处理标准HTTP请求那样处理XHR,因此会阻止在响应中显示Flash

这意味着您必须做一些事情才能通过您的Ajax请求传递Flash对象。根据我在此答案顶部发布的问题,您可以使用response headers来执行此操作:

class ApplicationController < ActionController::Base
after_filter :flash_to_headers

def flash_to_headers
  return unless request.xhr?
  response.headers['X-Message'] = flash[:error]  unless flash[:error].blank?
  # repeat for other flash types...

  flash.discard  # don't want the flash to appear when you reload page
end

$(document).ajaxError(function(event, request) {
  var msg = request.getResponseHeader('X-Message');
  if (msg) alert(msg);
});


 类似资料:
  • 问题内容: 当我使用表单操作提交表单数据时,我能够将消息闪回。 查看表格: 注册.HTML 现在,我正在使用ajax,不再显示Flash消息。 我的观点来处理表格数据: 我的布局页面使用以下代码段进行闪烁: 问题答案: 闪烁的消息存储为会话的一部分,并在服务器端呈现模板时检索。客户端JavaScript无法访问会话cookie。即使是这样,也不容易在JavaScript中解码。即使您可以解码它,也

  • 问题内容: 我正在尝试通过AJAX调用显示PDF(在服务器端创建并作为网络流传递给客户端)。我的代码如下: “ inputxml”包含用于服务器创建PDF的输入参数。和成功函数中包含PDF流的“数据”。是否可以在AJAX调用成功功能内的浏览器中打开PDF文件,而无需进行任何页面提交?在服务器端,PDF也不是物理生成的。非常感谢您的帮助。 问题答案: 为什么要通过AJAX加载它?为什么不将其加载到需

  • 这是我的array.php,json数据来自数据库,我从下面的脚本中得到了一个完美的输出 **array.php数据输出ex:** } 这是我的Ajax函数,在这里我从array.php中缩放数据 var data=new google.visualization.dataTable(json.parse(jsonData));var选项={title:'我的日常活动‘};var chart=ne

  • < code > autocomplete textview 出现了一个奇怪的问题。 我有一个,在键入时显示城市建议。城市列表通过 从远程服务器检索。当我使用软键盘或软键盘上的按钮时,建议工作正常。确实显示建议的城市。 但是,当我尝试使用设置文本时,我有一个问题。.我也尝试过但仍然没有运气。 适配器就在那里,只是建议没有显示出来。 有什么建议吗? 谢了。

  • 出于某种原因,我可以看到Log.i()及以上所有级别的消息,但看不到Log.d()或Log.v()级别的消息。一直没找到原因。有人知道如何解决这个问题吗? 一些进一步的细节:这不是我忘记在Eclipse的logcat下拉列表中选择适当级别的问题。有问题的日志消息也不会显示在我手机上用于logcat跟踪的应用程序上。(不过,调试日志消息会从其他应用显示)。我正在运行 OSX。

  • 问题内容: 提交登录表单后,使用Ajax调用以下方法。 问题是那行不通。 您将如何解决? 问题答案: 最后,我刚更换 有了这个: 而且效果很好!