ruby-on-rails - Rails:使用 RestClient 的外部 API 集成(未定义的局部变量或方法“用户”)
问题描述
我正在建立一个数字图书馆,我已经完成了很多需要的功能。我目前在将数字图书馆与学习管理系统 (LMS) 集成时遇到问题。
我已经有一个使用Devise gem的数字图书馆管理员身份验证系统。我的目标是允许想要访问数字图书馆的用户使用他们的学习管理系统 (LMS) 凭据(用户名和密码)登录数字图书馆。
我已经获得了 Login API 端点和学习管理系统 (LMS)的其他所需参数,并且我已经创建了User Model、Sessions Controller和Sessions View Templates。
我目前正在使用RestClient Gem进行 API 调用,我只想在成功调用 API 后保存登录信息session[:user_id] = user.id
,但我有一个错误undefined local variable or method `user' for #SessionsController。我想不通错了。
下面是我的源代码
会话控制器
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
变量赋值。
假设您的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
上述方法仅供参考,如有需要,您必须添加更多验证。
推荐阅读
- python - 使用tweepy的Python中的Urllib3连接错误
- api - 切片,groupBy []数组
- javascript - 如何判断 npm 上的包是否适用于 angular?
- sql-server - 尝试将大型 html 文本格式存储到产品的 nvarchar(MAX) 字段时超出限制
- regex - 匹配以不同字母开头和结尾的单词
- typescript - TS2339:“全局”类型上不存在属性“导航器”
- ios - iOS 和 android 平台上的应用程序安全性
- jquery - 更改根的 HTML 颜色选择器:css 变量
- python-3.x - paramiko stdout 的输出错误地传输行
- sql - 我如何计算咨询的人数