gpt4 book ai didi

javascript - ajax 调用后 Rails 不显示 flash 消息

转载 作者:可可西里 更新时间:2023-11-01 01:46:48 25 4
gpt4 key购买 nike

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

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

我发现我必须在 JS 单击事件期间进行页面刷新才能使 View 正确更新。仅在 Controller 中进行重定向或呈现是不够的。

因此,为此,我在我的 Controller 中设置了一个 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...

中包含了以下 Flash 显示逻辑
...
%body
= p flash.inspect
- flash.each do |type, message|
= content_tag(:div, message, :class => "flash-#{type}")

= render 'devise/menu/login_items'
= yield

注意:我在我的 View 中使用 HAML 而不是 ERB

然而,无论我怎样尝试,Flash 消息都没有显示。除了 flash message 之外,其他一切都按预期 工作,而且我无法弄清楚原因

我怀疑它与我正在做的 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)

最佳答案

我想权衡一下,因为将消息传递到 header 的需要似乎是一种 Rails 应该已经具备的能力的循环方式。

经过几个小时的搜索,我意识到我已经通过在我的 Controller 中传递以下几行来完成需要完成的工作:

flash[:error] = "My flash message error."

respond_to do |format|
format.js
end

flash[:error] 为以下 View 设置 Flash 消息,respond_to 意识到我在 link_to(原始 ajax 请求)中设置了 remote: true:

<%= link_to "My Ajax Request", some_path(@some_value), remote: true %>

并以 JavaScript 响应链接。如果您仍希望能够在不将 remote 设置为 true 的情况下调用同一 Controller ,则可以在此 block 中包含 format.html。

在我的 application.html.erb 中,我有一个呈现 flash 消息的部分:

<%= render "layouts/flash_notices" %>

并且该部分包含一个如下所示的 div:

<div id="flash_messages">
<% flash.each do |type, message| %>
<p><%= type %>: <%= message %></p>
<% end %>
</div>

最后我创建了一个名为 MY_CONTROLLER_ACTION_NAME.js.erb 的 View 并插入:

<% flash.each do |type, message| %>
$("#flash_messages").html("<%= type.to_s.humanize %>: <%= message.html_safe %>")
<% end %>

现在当我点击启用 AJAX 的链接时, Controller Action 被执行,flash 消息被设置, Controller 加载 js.erb View ,最后,javascript 用 id="flash_messages"替换我的 div 的内容被执行。我的原始 View 随即显消息更新,世界一切正常。

注意:如果您正在使用 Bootstrap 或其他一些特殊的 CSS 框架,您可以将该代码包含在 js.erb 文件的 $("#flash_messages').html(""); 调用中。我将我的 Bootstrap 代码包含为如下:

$("#flash_messages').html("<div class='alert <%= bootstrap_class_for(type) %> alert-dismissible' role='alert'><button class='close' data-dismiss='alert'>×</button><%= message.html_safe %></div>")

我知道这个问题是几个月前发布的,但是在搜索这个确切的问题时,响应似乎总是您需要通过标题发送即显消息。我想展示还有另一种方法。希望这会帮助我 future 的 Rails 新手!

关于javascript - ajax 调用后 Rails 不显示 flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21032465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com