Rails 6 предлагает скачать на мобильный - PullRequest
2 голосов
/ 04 мая 2020

У меня есть приложение Rails 6, в котором пользователи могут отправлять изменения в модель, а электронное письмо с подтверждением будет отправлено администраторам сайта. Изменения отправляются через модальное всплывающее окно, и после отправки всплывающее окно заменяется другим, подтверждающим, что электронное письмо было отправлено.

Проблема, с которой я сталкиваюсь, заключается в том, когда это делается на мобильном устройстве (я используя iPhone, не уверен, что это произойдет на Android), после отправки изменения появляется другое всплывающее окно, предлагающее мне загрузить файл размера 0 с именем обновляемой модели (это происходит как в Safari, так и в *) 1043 *). Этого не происходит в настольной версии сайта или в мобильном эмуляторе на рабочем столе, поэтому я не могу придумать, как я могу диагностировать эту проблему.

Вот код, который вызывается непосредственно перед Появляется всплывающее окно загрузки:

<%= 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

Вот функция send_confirmation_email, вызываемая в create :

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

А вот функция model_confirmation, вызываемая send_confirmation_email:

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

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

Нигде в этом коде я не могу увидеть, где мне может быть предложено загрузить файл , но увы это происходит. Приветствуется любая помощь в том, как правильно диагностировать или решить эту проблему. Спасибо!

EDIT: Я изменил свой код, чтобы модель обновлялась без отправки электронного письма с подтверждением. Кроме того, модальное окно больше не заменяется новым, подтверждающим, что электронное письмо было отправлено , и у меня все еще та же проблема. Это наводит меня на мысль, что проблема связана с созданием модели.

РЕДАКТИРОВАТЬ 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 %>

Я не уверен, почему именно это решило мою проблему, так что если кто-нибудь может дать некоторое представление, это будет очень признательно!

1 Ответ

1 голос
/ 13 мая 2020

Проблема связана с тем, как вы создали экземпляр form_for. Когда вы отправляете форму объекту Model.new, form_for пытается вывести контроллер с помощью метода create для его обработки. Узнайте больше, как form_for работает в https://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

С учетом сказанного, метод create, вероятно, выводит что-то или ничего вместо перенаправления, поэтому вы получаете загрузку на мобильном устройстве а в браузерах это просто пустая страница, потому что они могут с этим справиться. Если в методе нет рендеринга, Rails ответит 204 No Content или пустой текстовой страницей. Вы должны проверить свой метод об этом.

Когда вы используете remote: true, я процитирую документы:

: remote - Если установлено значение true, ненавязчивый JavaScript для управления поведением отправки. По умолчанию это поведение ajax submit.

Таким образом, вместо перезагрузки страницы U JS отправляет XMLHttpRequest на страницу «backend», поэтому вы не получаете перенаправление. Результат отправки обрабатывается без перенаправления. Но по результату запроса может прийти контент страницы. Поэтому важно, чтобы вы дали соответствующий ответ. По ссылкам ниже вы найдете правильный способ сделать это.

Подробнее см. В следующих вопросах:

Также в руководствах Rails:

Это также хорошая ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...