如果 Rails UJS (ajax) returns 出现错误或超时,则阻止数据库操作
Prevent database action if Rails UJS (ajax) returns an Error or Timeout
我有一个 Rails UJS 模态。当用户单击按钮时,它会触发 ajax 调用。
我更新了某些数据库,但我希望在 rails ujs/ajax 调用超时或输出错误的情况下,不要更新这些数据库。
我觉得我需要在控制器中执行此操作,但我找不到方法。
HTML
<div id="zone" class="has-js">
<%= link_to image_tag(smallest_src_request),
deal_modal_path,
remote: true,
class: "deal",
alt: "loadin'" %>
</span>
</div>
<% end %>
</div>
控制器
def deal_modal
# First Find UserDeal participation and update it
find_and_update_selected_userdeal
# Actions on User
update_user_profile
respond_to do |format|
format.js
end
end
因此,如果请求超时,我会显示像 'Sorry too long...' 这样的经典消息,这很好,但我注意到尽管如此,我实际上是在执行所有控制器操作并更新 suerdeal 和用户 table s.
我不想。
我可以使用之前或 after_filter 并说如果 xhr 状态是错误的(我认为它包括 "timeout" 的情况),那么不要在 [=56= 中执行所有这些方法] 方法,例如 find_and_update_selected_userdeal 和 update_user_profile?
这可能吗?
编辑
一些上下文
此问题与数据库调用效率无关。实际上它非常快(正常连接是 150 毫秒)但是该应用程序是移动密集型的并且有一些 "business rules"(特别是用户可以看到模态内容的次数,在他单击按钮后出现, 仅限于 3).
例如:用户在地铁里(现在他有互联网连接)。他点击 link,今天用 user.total_nb_clicks(增量 1)更新 table 用户,但随后他进入了一个几乎没有互联网连接的隧道 20 秒。出于用户体验的原因,我在我的应用程序中设置了一个 Rails UJS 超时 10 秒(这样用户就不会认为这是一个错误)。所以连接太慢了,模态中通过 Rails UJS 的消息不是结果而是 'sorry timeout, try again' 之类的东西。但是他只被允许尝试他的运气 3 次所以我不应该更新他的专栏 'total_shots'。这不是他的错,也不是应用程序的错,有一条隧道,他只有 5kb/秒的互联网连接:他应该仍然有权再看到 2 个 modals/Results。这是可能发生的真实移动用例问题...
我在 how Heroku suggests you handle timeout in its environment 上看到了类似的问题,但我认为它不适用于您的案例场景,因为您的超时与长 运行 服务器端处理无关。
当您的控制器完成其工作时,如果客户端在请求后未能收到响应,则无法知道 http 请求是否成功。我相信这是因为 HTTP Protocol is stateless.
也就是说,您可以尝试其他方法。我能想到的更直接的方法是:保留信息以在用户下次尝试可视化内容或重新建立连接时向用户显示相同的数据(不算新的点击)。
我有一个 Rails UJS 模态。当用户单击按钮时,它会触发 ajax 调用。 我更新了某些数据库,但我希望在 rails ujs/ajax 调用超时或输出错误的情况下,不要更新这些数据库。
我觉得我需要在控制器中执行此操作,但我找不到方法。
HTML
<div id="zone" class="has-js">
<%= link_to image_tag(smallest_src_request),
deal_modal_path,
remote: true,
class: "deal",
alt: "loadin'" %>
</span>
</div>
<% end %>
</div>
控制器
def deal_modal
# First Find UserDeal participation and update it
find_and_update_selected_userdeal
# Actions on User
update_user_profile
respond_to do |format|
format.js
end
end
因此,如果请求超时,我会显示像 'Sorry too long...' 这样的经典消息,这很好,但我注意到尽管如此,我实际上是在执行所有控制器操作并更新 suerdeal 和用户 table s.
我不想。
我可以使用之前或 after_filter 并说如果 xhr 状态是错误的(我认为它包括 "timeout" 的情况),那么不要在 [=56= 中执行所有这些方法] 方法,例如 find_and_update_selected_userdeal 和 update_user_profile?
这可能吗?
编辑
一些上下文
此问题与数据库调用效率无关。实际上它非常快(正常连接是 150 毫秒)但是该应用程序是移动密集型的并且有一些 "business rules"(特别是用户可以看到模态内容的次数,在他单击按钮后出现, 仅限于 3).
例如:用户在地铁里(现在他有互联网连接)。他点击 link,今天用 user.total_nb_clicks(增量 1)更新 table 用户,但随后他进入了一个几乎没有互联网连接的隧道 20 秒。出于用户体验的原因,我在我的应用程序中设置了一个 Rails UJS 超时 10 秒(这样用户就不会认为这是一个错误)。所以连接太慢了,模态中通过 Rails UJS 的消息不是结果而是 'sorry timeout, try again' 之类的东西。但是他只被允许尝试他的运气 3 次所以我不应该更新他的专栏 'total_shots'。这不是他的错,也不是应用程序的错,有一条隧道,他只有 5kb/秒的互联网连接:他应该仍然有权再看到 2 个 modals/Results。这是可能发生的真实移动用例问题...
我在 how Heroku suggests you handle timeout in its environment 上看到了类似的问题,但我认为它不适用于您的案例场景,因为您的超时与长 运行 服务器端处理无关。
当您的控制器完成其工作时,如果客户端在请求后未能收到响应,则无法知道 http 请求是否成功。我相信这是因为 HTTP Protocol is stateless.
也就是说,您可以尝试其他方法。我能想到的更直接的方法是:保留信息以在用户下次尝试可视化内容或重新建立连接时向用户显示相同的数据(不算新的点击)。