Rails:使用 RestClient 的外部 API 集成(未定义的局部变量或方法“用户名”)

Rails: External API Integration using RestClient (undefined local variable or method `username')

我正在建设一个数字图书馆,我已经完成了很多需要的功能。我目前在将数字图书馆与 Learning Management System (LMS) 集成时遇到问题。

我已经使用 Devise gem 为数字图书馆创建了管理员身份验证系统。我的目标是允许想要访问数字图书馆的用户使用他们的 Learning Management System (LMS) 凭据(用户名和密码)登录数字图书馆。

我已经获得 Learning Management 系统 (LMS) 的登录 API 端点和其他所需参数,并且我有创建了用户模型会话控制器会话视图模板.

我目前正在使用 RestClient Gem 进行 API 调用,但出现错误 未定义局部变量或方法`username' for # 你的意思是? user_path。我不知道哪里出了问题。

会话控制器

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

会话新视图

<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 %>

用户模型

class User < ApplicationRecord
  has_secure_password

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

我们将不胜感激任何形式的代码示例帮助。如果需要,我也愿意提供有关此集成的更多信息。提前谢谢你。

也许你应该使用 params[:username] 而不仅仅是 username

payload中的

usernamepassword是未定义的变量。请设置它们的值。可能的值可以是 params[:username]params[:password]

我认为问题实际上是在 SessionsController in create 操作中,您正在插入 usernamepassword。您的代码中没有这些方法的定义,因此您得到 undefined local variable or method.

您可能会像这样从参数中选择那些:

def username
  params[:username]
end

def password
  params[:password]
end

或者将它们直接插入到负载中,用 params[:username]params[:password] 替换当前方法调用。

在这种情况下,最好使用 byebugpry 来调试代码并查看控制器内部发生的情况。

您还可以考虑关闭服务对象中的某些逻辑部分 - 控制器操作中不应该有超过 10-15 行(除非情况需要)