0
votes

Rails: Intégration d'API externe à l'aide de RestClient (variable locale ou méthode non définie `username ')

Je suis en train de créer une bibliothèque numérique et j'ai complété de nombreuses fonctionnalités nécessaires. J'ai actuellement un problème avec l'intégration de la bibliothèque numérique avec un système de gestion de l'apprentissage (LMS).

J'ai déjà un système d'authentification administrateur pour la bibliothèque numérique à l'aide du Devise gem . Mon objectif est de permettre aux utilisateurs qui souhaitent accéder à la bibliothèque numérique de se connecter à la bibliothèque numérique en utilisant leurs informations d'identification du système de gestion de l'apprentissage (LMS) (nom d'utilisateur et mot de passe).

J'ai reçu le point de terminaison de l'API de connexion et d'autres paramètres nécessaires du système de gestion de l'apprentissage (LMS) , et j'ai créé le modèle utilisateur , le contrôleur de sessions et le Modèles d'affichage des sessions .

J'utilise actuellement le RestClient Gem pour l'appel d'API, mais j'ai une erreur variable locale ou méthode non définie "username" pour # Vouliez-vous dire? chemin_utilisateur . Je ne sais pas où les choses ont mal tourné.

Contrôleur de sessions

class User < ApplicationRecord
  has_secure_password

  validates :username, presence: true, uniqueness: true
end

Nouvelle vue des sessions strong>

<p id=”alert”><%= alert %></p>
<h1>Login</h1>
<%= form_tag sessions_path do %>
  <div class="field">
    <%= label_tag :username %>
    <%= text_field_tag :username %>
  </div>
  <div class="field">
    <%= label_tag :password %>
    <%= password_field_tag :password %>
  </div>
  <div class="actions">
    <%= submit_tag 'Login' %>
  </div>
<% end %>

Modèle utilisateur

require 'rest-client'

class SessionsController < ApplicationController
  def new
  end

  def create
    response = RestClient::Request.execute(
      method: :post,
      url: 'https://newapi.example.com/token',
      payload: { 'username': "#{username}",
                 'password':  "#{password}",
                 'grant_type':'password' },
      headers: { apiCode: '93de0db8-333b-4f478-aa92-2b43cdb7aa9f' }
    )

    case response.code
    when 400
      flash.now[:alert] = 'Email or password is invalid'
      render 'new'
    when 200
      session[:user_id] = user.id
      redirect_to root_url, notice: 'Logged in!'
    else
      raise "Invalid response #{response.to_str} received."
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: 'Logged out!'
  end
end

Toute forme d'aide avec des exemples de code sera très appréciée. Je suis également ouvert à fournir plus d'informations sur cette intégration si nécessaire. Merci d'avance.


0 commentaires

3 Réponses :


1
votes

Peut-être devriez-vous utiliser params [: username] plutôt que seulement username ?


2 commentaires

Je vous remercie beaucoup pour votre aide. Je rencontre un autre problème 400 Bad Request . Voici un lien vers la question stackoverflow.com/q/57615476/10907864 . Merci.


Je vous remercie beaucoup pour votre aide. J'ai un autre problème variable locale non définie ou méthode "user" pour #SessionsController . Voici un lien vers la question stackoverflow.com/q/57615870/10907864 . Merci.



1
votes

nom d'utilisateur et mot de passe dans la charge utile sont des variables non définies. Veuillez définir leurs valeurs. Les valeurs possibles peuvent être params [: username] et params[:password


2 commentaires

Je vous remercie beaucoup pour votre aide. Je rencontre un autre problème 400 Bad Request . Voici un lien vers la question stackoverflow.com/q/57615476/10907864 . Merci.


Je vous remercie beaucoup pour votre aide. J'ai un autre problème variable locale non définie ou méthode "user" pour #SessionsController . Voici un lien vers la question stackoverflow.com/q/57615870/10907864 . Merci.



1
votes

Je pense que le problème est en fait qu'à l'intérieur de votre SessionsController dans l'action create , vous interpolez username et password . Il n'y a pas de définition pour ces méthodes dans votre code, donc vous obtenez variable locale ou méthode non définie .

Vous pourriez probablement choisir celles de paramètres comme celui-ci:

def username
  params[:username]
end

def password
  params[:password]
end

Ou interpolez-les directement dans la charge utile en remplaçant les appels de méthode actuels par params [: username] et params[:passwordITED.

Dans de telles situations , il est bon d'utiliser byebug ou pry pour déboguer votre code et voir ce qui se passe à l'intérieur de votre contrôleur.

Vous pourriez aussi penser à fermer certaines parties de votre logique dans les objets Service - vous ne devriez pas avoir plus de 10 à 15 lignes dans l'action de votre contrôleur (sauf si la situation l'exige)


3 commentaires

Pas de problème, heureux de vous aider :)


Je vous remercie beaucoup pour votre aide. Je rencontre un autre problème 400 Bad Request . Voici un lien vers la question stackoverflow.com/q/57615476/10907864 . Merci.


Je vous remercie beaucoup pour votre aide. J'ai un autre problème variable locale non définie ou méthode "user" pour #SessionsController . Voici un lien vers la question stackoverflow.com/q/57615870/10907864 . Merci.