Форма Inline Devise Signup с использованием Turbo Frames

У меня возникли проблемы с настройкой регистрационной формы Devise с помощью Turbo Frames. Я бы хотел, чтобы форма регистрации Devise была настроена как форма «постепенного взаимодействия», для которой требуется только электронная почта для регистрации нового пользователя с домашней страницы.

Вот как я настроил это до сих пор:

  • Во- первых, я использовал этот обходной путь , чтобы заставить представления Devise по умолчанию работать с Hotwire.
  • Затем я использовал этот подход , чтобы заставить форму регистрации разработки работать на моей домашней странице.
  • Наконец, я использовал этот метод для настройки регистрации только по электронной почте с помощью Devise.

Это все работает, как и ожидалось, но когда пользователь завершает регистрацию, он перенаправляет и показывает флэш-страницу. Вместо этого я хотел бы использовать Turbo Frames, чтобы просто заменить форму сообщением типа «Спасибо за регистрацию» без перезагрузки какой-либо страницы или перенаправления.

Кроме того, если в форме есть какие-либо ошибки (например, электронная почта пуста), она перенаправляется на представление регистрации устройства по умолчанию и отображает там ошибки. Я бы предпочел, чтобы это происходило во фрейме домашней страницы, чтобы не было перезагрузки страницы при отображении ошибки.

Итак, как мне сделать это с Devise и Turbo Frames?

Вот форма, которая работает на главной странице:

      <%= form_for resource, :as => resource_name, :url => registration_path(resource_name), html: { class: "sm:flex" } do |form| %>
  <%= form.label :email, class: "sr-only" %>
  <%= form.email_field :email %>
  <div class="mt-3 rounded-md shadow sm:mt-0 sm:ml-3 sm:flex-shrink-0">
    <%= form.submit "Subscribe" %>
  </div>
<% end %>

И, чтобы заставить это работать, я создал confirmations_controller.rbкоторый переопределяет значение по умолчанию Devise::ConfirmationsControllerкак это:

      class ConfirmationsController < Devise::ConfirmationsController
  private
  def after_confirmation_path_for(resource_name, resource)
    sign_in(resource) # In case you want to sign in the user
    root_path
  end
end

Нужно ли мне создавать UsersController, который переопределяет некоторые части Devise для использования турбокадров? Как бы я это сделал?

1 ответ

Вы не сможете использовать after_X_path_forсделать это с помощью Turbo. К тому времени, когда вы ударите after_confirmation_path_for, насколько я понимаю, Devise уже инициировал перенаправление, поэтому слишком поздно переходить на ответ Turbo. Эти шаги должны приблизить вас:

  1. Вам нужно включить Turbo в вашей форме, добавив опцию data: { turbo: true }или обернуть его в элемент. Вы видите полную перезагрузку страницы и флэш-сообщение, потому что оно отсутствует.

  2. Ваша форма (или родитель turbo-frame) нужен идентификатор для ответа Turbo на цель (т. е. действие контроллера должно знать, какой элемент обновлять).

  3. Похоже, отправка вашей формы обрабатывается RegistrationsController. Вам нужно будет настроить действие контроллера (вероятно, #create?), чтобы иметь блок, который фактически отображает ответ Turbo, что-то вроде следующего:

      respond_to do |fmt|
  fmt.turbo_stream do
    render turbo_stream: turbo_stream.replace(
      form_element_id,
      partial: 'your_html_partial/here',
      locals: {
        current_user: your_user,
        other: "data"
      }
    )
  end
end

Наконец, это не отвечает на ваш вопрос, но будет намного проще реализовать это без Devise, главным образом потому, что вы делаете так много настроек. Devise лучше всего подходит для ограниченной настройки (потому что, как и Rails, он имеет очень строгие соглашения). Реализация этого потока должна включать только пару действий контроллера (рендеринг формы входа/регистрации, обработка отправки формы с помощью Турбо-потока).

Другие вопросы по тегам