【发布时间】:2019-09-03 14:08:22
【问题描述】:
我正在使用我的模型和我的控制器进行的 api 调用接收到一个 json 响应 (response.body),我想在我的控制器中解析它以将其 id 键的值存储在我的会话 [:user_id] 中。
我尝试通过以下方式实现它
parsed_body = JSON.parse(User.new.get_credentials, :symbolize_names => true)
puts "The parsed_body is: #{parsed_body}"
session[:user_id] = parsed_body[0][:id]
puts "The session id is: #{session[:user_id]} "
response.body 是:
{"result":[{"id":"3","username":"Sam","password":"111"},{"id":"4","username":"Harshal","password":"1234"},{"id":"5","username":"Dev","password":"112"},{"id":"6","username":"Lam","password":"113"},{"id":"7","username":"Tim","password":"114"},{"id":"8","username":"Harry","password":"222"}]}
parsed_body 是:
{:result=>[{:id=>"3", :username=>"Sam", :password=>"111"}, {:id=>"4", :username=>"Harshal", :password=>"1234"}, {:id=>"5", :username=>"Dev", :password=>"112"}, {:id=>"6", :username=>"Lam", :password=>"113"}, {:id=>"7", :username=>"Tim", :password=>"114"}, {:id=>"8", :username=>"Harry", :password=>"222"}]}
这是我的用户控制器、用户模型和会话控制器的代码:
用户控制器
class UsersController < ApplicationController
def create
@users = User.new(token: user_params).credentials
parsed_body = JSON.parse(User.new.get_credentials, :symbolize_names => true)
puts "The parsed_body is: #{parsed_body}"
session[:user_id] = parsed_body[0][:id]
puts "The session id is: #{session[:user_id]} "
redirect_to '/dashboard'
end
private
def user_params
params.require(:user).permit(:id, :username, :password).to_hash
end
end
用户模型
class User
def initialize(attributes={})
@token ||= attributes[:token]
end
def credentials
my_connection = Net::HTTP.new('localhost', 8080)
request = my_connection.post('/restapitrial/index.php/Users/insert/', @token.to_json, "Content-Type" => "application/json")
end
def get_credentials
my_connection = Net::HTTP.new('localhost', 8080)
request = my_connection.get('/restapitrial/index.php/Users/displayinfo/', "Content-Type" => "application/json")
puts "The req body is #{request.body}"
return request.body
end
end
会话控制器
class SessionsController < ApplicationController
def create
user = User.find_by(id: login_params[:id])
if user && user.authenticate(login_params[:password])
session[:user_id] = user.id
redirect_to '/dashboard'
else
flash[:login_errors] = ['invalid credentials']
redirect_to '/'
end
end
private
def login_params
params.require(:login).permit(:id, :username, :password)
end
end
【问题讨论】:
-
parsed_body具有顶级密钥:result,因此您可能需要session[:user_id] = parsed_body[:result][0][:id],但您没有向我们提供任何提示,您提供的示例中实际上有什么问题。它会以错误的身份保存吗?还是引发异常?顺便说一下,请不要从模型调用API。 -
@katafrakt 它为我所做的实现(上面提到)给出了“UserController#create undefined method `[]' for nil:NilClass”错误。我的 API 是一个与 phpmyadmin 数据库通信的 php 文件,因此我正在与之交互。前端 Rails - 后端 PHP。
-
那是因为
parsed_body[0]确实是nil。试试我上面提到的parsed_body[:result][0][:id]。 -
@katafrakt 正如你所建议的,我做了 parsed_body[:result][0][:id]。但是,它只是返回给我的第一个 id 值。通过输入他/她的 id 来存储注册用户的 id。
标签: ruby-on-rails json ruby