Как мне подойти к добавлению реагирующего интерфейса в веб-приложение, созданное с помощью рельсов?

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


person greg    schedule 28.02.2020    source источник


Ответы (1)


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

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

В обоих случаях вам понадобится разработать токен 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

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

person André Kraüss    schedule 28.02.2020