Разработайте сгенерированные адреса почтовых программ с помощью devise_for в областях Rails - PullRequest
0 голосов
/ 08 мая 2018

Я создаю приложение Rails с каркасом Javascript, поэтому Rails обслуживает внутренний API.

На данный момент приложение просто реализует все представления и действия устройства.

Для этого приложение Rails принимает только вызовы JSON на свои /api/ URL-адреса и требует, чтобы Devise работал только с вызовами JSON, поэтому я определил их следующим образом:

Rails.application.routes.draw do
  scope :api, module: :api, constraints: { format: 'json' } do
    devise_for :users, controllers: {
      confirmations: 'devise/confirmations',
      registrations: 'devise/registrations',
      sessions: 'sessions'
    }

    resources :users
  end

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root to: 'home#index'
  get '*path', to: 'home#index'
end

Комуобъясните, что здесь происходит:

  • Первая часть определяет URL-адреса API, в том числе разработанные, и определяет ресурсы API (на данный момент только :users)
  • Затем определяетсяroot route
  • Наконец, переадресует любые вызовы на маршрутизатор Javascript (позволяющий управлять перезагрузкой страницы или внешними ссылками, такими как ссылки электронной почты).

Все работает нормально, за исключениемссылка для подтверждения учетной записи электронной почты.В отправленном электронном письме с подтверждением есть ссылка, включающая /api/ (http://localhost:3001/api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc), в то время как она должна быть без (Ожидаемый URL: http://localhost:3001/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc).

Как я могу создать устройство для отправки электронного письма с подтверждением (и всехсообщения электронной почты) без /api/ части?

Обновление

Глядя глубже в исходный код устройства, я обнаружил, что шаблон представления письма подтверждения используетconfirmation_url Rails с именем route, что является правильным.

В моем случае мне нужно, чтобы ВСЕ разработанные маршруты были ограничены маршрутом /api/ и форматом JSON, за исключением нескольких маршрутов, равных 2определено время: первый раз из области действия /api/ в формате HTML (который будет перенаправлен в мое приложение JavaScript) и второй маршрут в области действия /api/, который будет вызываться приложением JavaScript.

Пример: Ожидаемый стек выполнения подтверждения создания учетной записи

  1. Rails получает запрос на /users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc
  2. Rails пересылает запрос на маршрутизатор Javascript
  3. Javascript framework загружает соответствующую страницу
  4. Страница Javascript загружает службу, которая вызовет маршрут /api/users/confirmation?confirmation_token=XLDVqqMZwXg6dszyV_nc Devise для подтверждения учетной записи

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Есть два способа решения вашей проблемы.

  1. Сделайте ссылки в письмах в формате json (в конце укажите «.json»)

или

  1. Разрешить действия для ссылок из электронных писем, которые будут доступны через html (без ограничения format: 'json').

В этом примере показано, как это сделать для действия по подтверждению электронной почты.

scope :api, module: :api, constraints: { format: 'json' } do
  # skip routes generation for `confirmations` controller
  devise_for :users, skip: [:confirmations]

  # add allowed `confirmations` actions manually (all except for `show`)
  as :user do
    get 'confirmation/new', to: 'devise/confirmations#new', as: :new_user_confirmation
    post 'confirmation', to: 'devise/confirmations#create'
  end
end

# add `confirmations#show` action outside of `/api` scope to be available from email link by `html`
as :user do
  get 'confirmation', to: 'devise/confirmations#show', as: :user_confirmation
end

Если вы не хотите использовать HTML-представления и действия Devise, вы можете настроить контроллеры Devise или написать свои собственные. В этом примере показано, как настроить контроллер подтверждения Devise:

# app/controllers/confirmations_controller.rb
class ConfirmationsController < Devise::ConfirmationsController
  def show
    # do whatever you want
  end
end 

# config/routes.rb
scope :api, module: :api, constraints: { format: 'json' } do
  # tell Devise to use your custom confirmations controller
  devise_for :users, controllers: {confirmations: "confirmations"}
end

Обновлено

Кроме того, если вы хотите, чтобы ваши ссылки электронной почты не имели никакого отношения к Devise API, вы можете настроить представления почтовой программы Devise, чтобы изменить тексты электронной почты и поместить туда нужные ссылки.

Команда rails generate devise:views создаст стандартные представления Devise, включая шаблоны почтовых программ, которые вы можете настроить.

0 голосов
/ 09 мая 2018

Вы должны иметь возможность просто добавить два дополнительных маршрута после начальных маршрутов API. Как это:

Rails.application.routes.draw do
  scope :api, module: :api, constraints: { format: 'json' } do
    devise_for :users, controllers: {
      confirmations: 'devise/confirmations',
      registrations: 'devise/registrations',
      sessions: 'sessions'
    }

    resources :users
  end

  devise_for :users, controllers: {
    confirmations: 'devise/confirmations',
    registrations: 'devise/registrations'
  }

  root to: 'home#index'
  get '*path', to: 'home#index'
end

Трудно сказать наверняка, не видя код переднего конца, но хорошо иметь оба маршрута.

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