我在我的应用中看到一些奇怪的行为。这是一个使用JQuery的Rails 4应用程序。该应用程序使用javascript非常香草(即混合中没有Angular,React,Ember的东西)。
在“帐户设置”页面上,有一个表单,用户可以切换该值以自动续订订阅。当他们切换时,会对订阅控制器进行AJAX调用。
class SubscriptionsController < ApplicationController
def update
subscription_id = params['id']
updated_preference = params['auto-renew']
update = subscription.update_attributes(auto_renew: updated_preference)
respond_to do |format|
if update
format.js { flash[:success] = "Auto-Renew information has been updated." }
else
format.js { flash[:error] = "Something went wrong. Please try again later." }
end
end
end
理想的行为是在处理更新后,屏幕顶部会显示一条Flash消息。我在上面的操作中设置了flash消息。在更新操作的模板中,我向上滚动到页面顶部。
# inside app/views/subscriptions/update.js.erb
$('html, body').animate({ scrollTop: 0 }, 0)
我看到的行为是(1)订阅#update更新成功,(2)flash消息确实出现,然后(3)当我点击链接转到帐户设置页面时,那么当页面加载,出现Flash消息。刷新同一页面不会做任何事情,但点击该链接会。
我认为此问题的一部分可能是帐户设置由与订阅不同的控制器管理,并且Rails在呈现与订阅#update操作相关联的模板后无法确定要执行的操作。但说实话,我对可能造成这种情况的原因感到茫然。
有谁可以解释这里发生了什么?此外,任何人都可以告诉我应该做什么来获得理想的行为吗?
答案 0 :(得分:1)
Flash不会在JS中呈现,因此它只出现在下一个HTML页面加载中。您需要将成功/错误消息返回到AJAX调用并手动更新HTML。