Rails 控制器 - 仅当 Rails UJS 方法内部成功时才执行操作(相互依赖的方法)

2024-02-25

接下来的另一个问题(Rails 控制器 - 仅当内部的两个方法成功时才执行操作(相互依赖的方法) https://stackoverflow.com/questions/37727642/rails-controller-execute-action-only-if-the-two-methods-inside-succeed-mutual),我想确保在我的控制器操作中,如果用户没有看到 Rails UJS 方法显示的消息,则控制器操作的第一个方法也不会实现。

CONTEXT

我有一个控制器,其方法称为“操作”。当应用程序进入“example_action”方法时,它会实现第一个方法 (1) update_user_table,然后 (2) 另一个 update_userdeal_table。 (两者都会读取和写入数据库)然后 (3) 第三种方法,与 Rails UJS(ajax) 调用相关。

我的问题如下:如果控制器中间超时,我想避免更新 User 表(通过方法 1)、更新 UserDeal 表(通过方法 2)但不是第三种方法的情况即显示消息 FAILS 的 ajax 请求(错误、超时...状态如 500 或 404 或已取消或超时...)。

在我的应用程序中,对于移动用户,如果他们在有互联网连接的地铁中,他们会启动通过“example_action”控制器的请求,成功执行第一种方法 (1) 和第二种方法 (2),但随后他们进入隧道60 秒,非常非常低(

我需要两种方法(1)和(2)和(3)“相互依赖”:如果一种方法不成功,则不应执行另一种方法。这是我能描述它的最好方式。

今天这是我的代码。它不起作用,因为我通过单击手动测试,然后仅 2 秒后我就断开了互联网连接。我在数据库中看到执行了 (1) 和 (2),并且数据库已更新,但我看到消息“抱歉,花了太长时间,请重试”。

这是正确的做法吗?如果是的话该怎么做? 如果没有,我是否应该尝试不同的角度,例如:如果(1)和(2)成功但不成功(3)我是否应该存储 Rails UJS xhr 状态是错误或超时的事实,因此模态 wx 未有效显示给用户,然后在他们重新上线后向他们显示结果/消息?

这是代码

用户的 html 页面用户单击触发 Rails UJS ajax 请求的按钮,该请求最终将显示模式消息

<div id=zone"> 
   <%= link_to image_tag(smallest_src_request),
          deal_modal_path,
           remote: true %>
</div>

这发送到指向此控制器操作的路由

交易控制者

class DealsController < ApplicationController
  def deal_modal
    Deal.transaction do
       update_user_table # that's the (1)
       update_userdeal_table  # that's the (2)
       # show_modal_message
       respond_to do |format|
         format.js
       end  
  end

  private
  def update_user_table
    # update the table User so it needs to connect to internet and acces the distant User table
  end
  def update_userdeal_table
    # update the table UserDeal table so it needs to connect to internet and access the distant UserDeal table
  end
end

这指向一个 js.erb 视图文件

deal_modal.js.erb

showModalMessage("Here is your result <variable and all>);

为了管理 ajax、错误、超时...(如果需要解决问题),我使用 Rails UJS 设置。

重要的:在这里,如果出现错误或超时,我会发送错误/超时模式消息来代替您通常收到的消息(请参见上面的“这是您的结果..”)

$(document).on('page:change', function () {
      $("#zone").
        on('ajax:error',function(event,xhr, status, error){
          console.log(' ajax call failed:', error);
          var msg;
          msg = Messenger().post({
            hideAfter:  4, 
            message:    "sorry it took too long, try again."
          });
    });

$(document).on('page:change', function () {
  //set timeout Rails UJS ajax option that will display message for ajax:error cases defined above
  $.rails.ajax = function(options) {
    if (!options.timeout) {
      options.timeout = 5000;
    }    
    return $.ajax(options);
  };
});

因此,只有在抛出错误时事务才会回滚。如果抛出未处理的错误,您的应用程序将崩溃,并以某种方式显示 500 错误。

为了向用户显示响应,无论成功还是错误,您都需要渲染一些内容。所以你不想阻止respond_to阻止执行。处理这个问题的一种方法是通过实例变量设置一个标志。

def deal_modal
  begin
    Deal.transaction do
      update_user_table
      update_userdeal_table
    end
    @success = true
  rescue
    @success = false
  end
  # show_modal_message
  respond_to do |format|
    format.js
  end  
end

Then in deal_modal.js.erb

<% if @success %>
  showModalMessage("Here is your result <variable and all>");
<% else %>
  showModalMessage("There was a problem");
<% end %>

EDIT:

处理连接问题绝对是一件棘手的事情,并且没有一种理想的解决方案。我通常会让数据库不间断地继续运行,并让它在自己的时间返回成功或失败。对于冗长的交易,您可以使用类似 gem延迟作业 https://github.com/collectiveidea/delayed_job or sidekiq https://github.com/mperham/sidekiq在后台处理操作并让 Rails 控制器返回一个响应,表示“...待处理...”或其他内容。除非您在前端使用 websockets,否则这意味着使用 ajax 请求不断轮询服务器以查看后台进程是否完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 控制器 - 仅当 Rails UJS 方法内部成功时才执行操作(相互依赖的方法) 的相关文章

  • 如何从 method_missing 获取绑定?

    我试图找到一种方法来从 Ruby 1 8 中的 method missing 中的调用者获取绑定 但我似乎找不到方法来做到这一点 希望下面的代码能解释我想做的事情 class A def some method x 123 nonexist
  • 带有嵌入式 Ruby 的 Javascript:如何安全地将 ruby​​ 值分配给 javascript 变量

    我在页面的 javascript 块中有这一行 res foo 处理这种情况的最佳方法是什么 ruby var里面有单引号吗 否则会破坏 JavaScript 代码 我想我会用红宝石JSON http json org ruby var 上
  • 使用ajax轮询服务器

    我正在建立一个网站 该网站有一个用户可以互相发送消息的系统 我希望这样当登录用户收到消息时 他会在屏幕上看到一些更新告诉他这一点 这些消息不必是实时的 所以我认为我不想用彗星或主宰之类的东西来推动 相反 我很乐意每隔一分钟左右轮询一次服务器
  • Rails 4 - 带有 dependent-fields-rails 的条件 JS

    我正在尝试弄清楚如何在我的 Rails 4 应用程序中使用 dependent fields rails gem 我迷路了 我已将 underscore js 包含在我的供应商 javascripts 文件夹中 并更新了我的 applica
  • 有没有办法让 Ruby 临时文件永久存在?

    如果我通过创建了一个临时文件Tempfile 除了将其复制到另一个文件之外 还有什么方法可以使其 永久 吗 我想避免它在关联时被删除Tempfile实例被垃圾收集或进程被终止 在相关的一点上 有没有办法利用Tempfile机制 或使用类似的
  • 在 Rails 5.1 及更高版本中,使用什么来代替“render :text”(和“render Nothing: true”)?

    轨道 5 1 其中就有老朋友render text 当你需要渲染的时候它非常有用some文本 但不想要视图模板的开销 例子 render text ok render text t business rules project access
  • 将 Twitter 引导样式添加到 Rails 表单助手

    在阅读建议我使用带有引导程序集成的 Simple form gem 的答案后 我安装了它并根据 simple form 说明创建了我的表单 但输入框向右浮动 这是布局 正在使用部分 shared reg 调用该表单 div class co
  • 使用 Devise 和 Rails 从 Twitter Oauth 获取电子邮件

    我已经设置了一个基本的 Rails 应用程序来使用 twitter oauth gem 和设计 并且已经能够登录用户 但是 我的问题是我现在已将我的应用程序列入白名单 并且我想在响应中收到用户的电子邮件 我已遵循 Twitter 端的所有必
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • A has_many Bs 其中 B 没有主键

    我有型号 A 和 B A has many B 并且 B 属于 A 到目前为止 一切都很好 除了我指定 B 没有主键 我不打算修改或删除单个 B 行 并且我预计会有数百万到数十亿的 B 行 因此省略主键将非常方便 节省空间 创建 B 表的迁
  • 无法在 IE 上运行 Selenium 脚本

    我必须在 IE 10 浏览器上运行 Selenium 测试 为了运行以下脚本 我执行了以下操作 下载IEDriverServer 64位 因为我的机器是64位 here http code google com p selenium dow
  • Flash观看后不清晰

    这是我的创建动作 它创建一个新的 Message 实例 并通过模型验证进行检查 然后有一个简单的 if else 循环 如果模型验证已完成 则发送消息 如果要发送另一个视图 则渲染 新 视图 如果模型验证未得到满足 它只会再次呈现 新 视图
  • Heroku 上的 Google Vision API 身份验证

    在 Heroku 上验证 Vision API 的最佳 简单方法是什么 在开发中我只使用 vision Google Cloud Vision new project instacult keyfile path to keyfile js
  • Rails - 可以在 javascript 函数中设置 Rails 变量吗?

    在 javascript 函数中设置 Rails 变量有什么问题吗 我无法在谷歌上搜索到明确的答案 只是想确保没有我不知道的陷阱或缺陷 我实际上对它是如何工作的感到困惑 如果 javascript 在客户端执行 我不会假设 Rails 会在
  • 如何在Windows 7上运行Ruby程序?

    有谁知道如何在 Windows 7 上运行 编译 Ruby 程序 例如 你可以在 Eclipse 中编译 Java 但我似乎找不到 Ruby 的编译器 http rubyinstaller org http rubyinstaller or
  • Jekyll 站点仅在推送到 GitHub 时才会失败

    我正在使用 Jekyll 开发一个新版本的静态网站 该网站通过 Github 页面部署 https devcampy com https devcampy com 存储库 https github com gianarb devcampy
  • ActiveRecord 布尔验证接受非布尔值

    我正在尝试验证属性是否为布尔值 即 true 或 false 从我期望的 Rails 指南中 validates new out of stock inclusion in true false 可以工作 但它接受非布尔值 例如 Hi 作为
  • Ruby 模板:如何将变量传递到内联 ERB 中?

    我有一个内联到 Ruby 代码中的 ERB 模板 require erb DATA a gt HELLO b gt WORLD template ERB new lt lt EOF current key is current value
  • 检查 Float 是否等于 Ruby 中的整数值

    假设我有以下代码 x 0 8 y 1 0 最好的检查方法是什么y相当于Integer 目前我正在做 y to int y 这可行 但我觉得应该有更好的方法 You mod值为 1 并检查该值是否等于 0 if y 1 0
  • 在您的装置数据中发现外键违规。确保您没有引用关联中不存在的标签

    我运行一个测试 rake test TEST test system my test rb 并看到这个 rake test TEST test system my test rb Running 1 tests in a single pr

随机推荐