【问题标题】:How can I parse a json response.body to store a key's value in ruby on rails?如何解析 json response.body 以将键的值存储在 ruby​​ on rails 中?
【发布时间】: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


【解决方案1】:

如果要获取返回的数组中的最后一个 id,请使用

parsed_body[:result][-1][:id]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多