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