【问题标题】:Rails 6 prompt to download on mobileRails 6提示在移动设备上下载
【发布时间】:2020-05-04 19:52:19
【问题描述】:

我有一个 Rails 6 应用程序,用户可以在其中提交对模型的更改,确认电子邮件将发送给站点管理员。更改通过模式弹出窗口提交,一旦提交,弹出窗口将替换为另一个确认电子邮件已发送的窗口。

我遇到的问题是在移动设备上完成此操作时(我使用的是 iPhone,不确定这是否发生在 Android 上),一旦提交更改,就会出现另一个弹出窗口,提示我下载大小为0 更新模型的名称(它发生在 Safari 和 Chrome 中)。这不会发生在网站的桌面版本或桌面上的移动模拟器中,所以我想不出如何诊断这个问题。

这是在下载弹出窗口出现之前调用的代码:

<%= button_tag "Submit", type: 'submit',
                         id: 'modal-subimt',
                         class: 'btn btn-primary',
                         onClick: 'replaceModal()' %>

这是提交表单时调用的create 函数:

def create
  ... # Setting the parameters for the model being changed
  if @model.save
    @model.send_confirmation_email()
  else
    # Irrelevant because the email gets sent
  end
end

这是create中调用的send_confirmation_email函数:

def send_confirmation_email()
  UserMailer.model_confirmation(self).deliver_now
end

这里是send_confirmation_email调用的model_confirmation函数:

def model_confirmation(model)
  @model = model
  recipient = <admin email>

  mail to: recipient, subject: "Model Confirmation"
end

在这段代码中,我无法看到可能会提示我下载文件的位置,但可惜它正在发生。任何有关如何正确诊断或解决此问题的帮助将不胜感激。谢谢!

编辑: 我更改了我的代码,以便在不发送确认电子邮件的情况下更新模型此外,模式不再替换为验证电子邮件已发送的新模式,我仍然遇到同样的问题。这让我相信问题出在模型的创建上。

编辑 2: 以前我正在创建模型并留在页面上(确认电子邮件已发送)。我将控制器更改为redirect_to request.referer,以便在更改完成后重新加载页面,完成后不再提示我下载空文件。不幸的是,我希望它工作的方式,重新加载页面并不是最佳的。在更新模型而不重新加载页面时,是否有任何原因会提示我下载?

解决方案: 我可以通过将remote: true 添加到form_for 行来解决这个问题,如下所示:

<%= form_for(Model.new, remote: true) do |f| %>
  ...
  <%= button_tag "Submit", type: 'submit',
                           id: 'modal-subimt',
                           class: 'btn btn-primary',
                           onClick: 'replaceModal()' %>
<% end %>

我不确定为什么这完全解决了我的问题,所以如果有人能提供一些见解,将不胜感激!

【问题讨论】:

  • 也许是因为你在本地提交表单,所以你进入了 create 方法,它什么都不呈现,你得到一个空文件而不是一些 html?也许浏览器不知道如何处理那个空文件,所以它返回一个下载。
  • 你试过form_with而不是form_for吗?我相信form_for 现在已被弃用。

标签: ios ruby-on-rails mobile


【解决方案1】:

问题与您如何实例化 form_for 有关。当您将表单提交给 Model.new 对象时,form_for 尝试使用 create 方法推断控制器以进行处理。在https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for中查看更多 form_for 的工作原理

话虽如此,create 方法可能会输出一些东西或什么都不输出,而不是重定向,这就是为什么你在移动设备上下载,而在浏览器中它只是一个空页面,因为它们可以处理它。如果该方法上没有渲染,Rails 将使用204 No Content 或空白文本页面来回答。你必须检查你的方法。

当您使用remote: true 时,我将引用文档:

:remote - 如果设置为 true,将允许 Unobtrusive JavaScript 驱动程序控制提交行为。默认情况下,此行为是 ajax 提交。

因此,UJS 不会重新加载页面,而是将XMLHttpRequest 发送到“后端”页面,这就是您没有获得重定向的原因。提交的结果被处理而不重定向。但是根据请求的结果,页面的内容可以来。因此,您必须做出相应的回应。在下面的链接中,您将找到正确的方法。

在这些问题中查看更多信息:

另外,在 Rails 指南中:

这也是一个很好的参考:

【讨论】:

  • 感谢您提供的所有信息!这很有意义!
猜你喜欢
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多