Как мне подойти к добавлению реагирующего внешнего интерфейса в веб-приложение, созданное с помощью rails? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть приложение, которое я построил с ruby на рельсах в бэкэнде, а передний конец представляет собой простой вид рельсов. Я хотел бы добавить реакцию на интерфейс, чтобы он выглядел лучше. Я читал о том, как использовать самоактивный реактивный рельс или создать новое реактивное приложение и использовать рельсовое приложение только в качестве API, поэтому мне интересно, каков наилучший подход. Я также использовал гем devise ruby для обработки аутентификации пользователя - но я видел некоторые вещи, которые указывают на необходимость использовать гем devise_token_auth, если я хочу go маршрут API rails ... Как бы вы подошли к добавлению отреагировать на окончательную версию приложения?

1 Ответ

1 голос
/ 28 февраля 2020

Я сделал оба стиля, которые вы упомянули, на моем собственном опыте мне больше нравилось иметь отдельный проект реагирования и использовать rails api, может быть, потому что я использую docker для своих сборок, и у меня было несколько проблем, когда я использовал гем rails-реагировать и webpacker, но преимущество в том, что вам не нужно делать 2 развертывания, в обоих подходах вам придется настраивать API.

ps: прекомпиляции webpacker в рельсах иногда могут быть довольно тяжелыми

Для обоих вам понадобится JWT-токен для аутентификации, но здесь - это хорошее руководство по настройке

, если вы хотите использовать оба метода аутентификации (html & json) вы можете использовать что-то подобное в контроллере сессий

    class Users::SessionsController < Devise::SessionsController
  respond_to :json, :html
  # before_action :configure_sign_in_params, only: [:create]

  def create
    if request.format.html?
      super
      # super {
      #   cookies[:token] = current_token || ""
      # }
    else
      resource = User.find_for_database_authentication(email: params[:email])
      return invalid_login_attempt unless resource

      if resource.valid_password?(params[:password])
        sign_in(resource, store: false)
        @payload = [resource, current_token]
        render(status: 200, success: true, json: @payload)
      else
        invalid_login_attempt
      end
    end
  end

  def invalid_login_attempt
    warden.custom_failure!
    render json: {
      success: false,
      message: 'Error with your email or password'
    }, status: 401, status: :unauthorized
  end

  def current_token
    request.env['warden-jwt_auth.token']
  end

  private

  def respond_with(resource, _opts = {})
    if request.format.html?
      super
    else
      render status: 401, success: false, json: { error: 'No autorizado' }
    end
  end

  def respond_to_on_destroy
    if request.format.html?
      super
    else
      head :ok
    end
  end
end

, вероятно, есть лучший способ сделать это, но он работает для меня, lol

...