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

2024-05-03

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

我已经有一个数字图书馆的管理员身份验证系统,使用设计宝石。我的目标是允许想要访问数字图书馆的用户使用其学习管理系统 (LMS) 凭据(用户名和密码)登录数字图书馆。

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

我目前正在使用RestClient 宝石对于API调用,我只想在API调用成功后将登录信息保存到session[:user_id] = user.id,但我有一个错误#SessionsController 的未定义局部变量或方法“user”。我想不出哪里出了问题。

下面是我的源代码

会话控制器

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': params[:username],
                 'password': params[: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

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


在您的会话控制器中,该行session[:user_id] = user.id,用户未定义,即您从未为user多变的。

假设你的User数据库(在数字图书馆中,而不是LMS)有当前登录用户的记录,那么你应该使用如下内容:

when 200
  session[:user_id] = response.body.data.user.id
  redirect_to root_url, notice: 'Logged in!'

现在是另一种情况,当用户在您的 LMS 中注册时,当他访问数字图书馆应用程序并尝试登录时,他将无法登录。因为您的数字图书馆应用程序没有与 LMS 链接的用户,也不了解有关 LMS 的任何信息。因此,每当用户创建会话时,您都需要检查用户记录是否存在于您的数字图书馆数据库中,如果不存在则创建一个。你可以这样做:

when 200
  if User.find(response.body.data.user.id).present?
    session[:user_id] = response.body.data.user.id
    redirect_to root_url, notice: 'Logged in!'
  else
    user = User.create(id: response.body.data.user.id, username: response.body.data.user.username, passord: params[:password], password_confirmation: params[:password])
    session[:user_id] = response.body.data.user.id
    redirect_to root_url, notice: 'Logged in!'
  end

以上方法仅供参考,如有需要请自行添加验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails:使用 RestClient 的外部 API 集成(未定义的局部变量或方法“user”) 的相关文章

随机推荐

  • .Net 有什么好的解析库吗?

    我正在寻找一些简单易用 语法易于定义的东西 虽然我以前没用过 ANTLR http www antlr org 有 C 运行时
  • ggplot 中的 Geom_area 顺序

    我的样本队列数据在绘制时未进行颜色编码或按正确的时间顺序显示ggplot 以下代码用于生成绘图 library ggplot2 blues lt colorRampPalette c lightblue darkblue p lt ggpl
  • 无法在 TFS 中签入 UserControl.xaml 文件。接收错误:TF10169

    Visual Studio 2013 中的项目类型是桌面应用程序 我在该桌面应用程序中添加了 XAML 格式的用户控件 我使用了一些兼容性函数和库 以便 xaml 控件能够与简单的桌面应用程序集成 TFS 正在检查其他相关文件 但是当将 x
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • ShinyApp:由对等方重置连接

    我之前构建的闪亮应用程序在我的旧笔记本电脑上运行良好 最近我买了一台装有Windows10的新笔记本电脑 设置完所有内容后 我尝试运行该应用程序 但浏览器立即打开并关闭 并出现错误 正在收听http 127 0 0 1 5004 http
  • 从自定义类导入时,XMLBeans jar 无法签名

    在 NetBeans 中 我创建了一个 Exporter 类 该类使用 APACHE POI 将一些数据导出到 EXCEL 文件 而 APACHE POI 使用 XMLBeans 我通过下载 zip 二进制文件并手动添加 jar 来添加 A
  • C# SerialPort BaseStream ReadAsync - CancellationToken 从未取消?

    我尝试以异步方式从串行端口读取数据 请记住操作所花费的时间不得超过指定的时间段 我使用的代码 private async Task
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • 如何在 SQL Server 2000 中传递大于 varchar(8000) 的字符串参数?

    如果将字符串参数定义为大小大于 8000 则会出现编译错误 e g The size 9000 given to the type varchar exceeds the maximum allowed for any data type
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • 对 Python 的 id() 感到困惑[重复]

    这个问题在这里已经有答案了 我可以理解以下定义 每个对象都有一个身份 类型和值 对象的身份 一旦创建就永远不会改变 你可能会认为它是 对象在内存中的地址 这is操作员比较身份 两个物体 这id 函数返回一个代表其值的整数 身份 我假设上面的
  • NodeJS:MySQL 有时会引发 ETIMEDOUT 错误

    我目前正在使用 NodeJS 开发一个应用程序 然而 经常服务器抛出这个错误 我无法与mysql交互 Error read ETIMEDOUT code ETIMEDOUT errno ETIMEDOUT syscall read fata
  • awk 比较多个文件

    我有2个文件 file1 1 apple 2 mango 3 banana 44 orange file2 1 apple 22 31 xyz 2 man 3 banana 44 oran 44 orange 我需要使用第 1 列和检查第
  • 产量回报延迟迭代问题

    我知道yield return 利用了延迟加载 但我想知道我是否可能滥用迭代器或者很可能需要重构 我的递归迭代器方法返回给定的所有祖先PageNode包括pageNode itself public class PageNodeIterat
  • Clojure / Noir:强制 HTTPS,如果请求是 http:// 则重定向到 https://

    我正在尝试在我的网站上强制使用 SSL 我想要一个环形中间件 将网站重定向到与 https 相同的 URL 如果它只是 http 我编写了以下代码 但除了检查请求方案并打印它应该重定向到的 URL 之外 它实际上没有做任何事情 defn h
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • SQLITE 文件已加密或不是数据库

    我有一个大问题 我正在使用 SQLite 开发一个桌面应用程序 但在复制 粘贴过程中我断电并且该过程终止 因此数据库丢失 但是 我找到了恢复它的方法 但是数据库是加密的 当我尝试使用打开连接时conn Open 我收到错误 SQLITE 已
  • 在 Laravel 中使用 PUT/DELETE 有什么价值?

    用于将路由定义为资源Route resource 文档表明 Verb Path Action Route Name GET resource index resource index GET resource create create r
  • Rails:使用 RestClient 的外部 API 集成(未定义的局部变量或方法“user”)

    我正在建设一个数字图书馆 我已经完成了很多需要的功能 我目前在将数字图书馆与学习管理系统 LMS 集成时遇到问题 我已经有一个数字图书馆的管理员身份验证系统 使用设计宝石 我的目标是允许想要访问数字图书馆的用户使用其学习管理系统 LMS 凭