【问题标题】:Sending back custom JSON response with ajax request使用 ajax 请求发回自定义 JSON 响应
【发布时间】:2018-02-23 16:17:51
【问题描述】:

我正在尝试将用户信息从后端发送回前端,但我很难理解应该如何格式化。

控制器

  def create
    user = User.new(user_params)

    if user.save
      auth_token = Knock::AuthToken.new(payload: { sub: user.id })
      created_user = {
        userEmail: user.email,
        userID:    user.id
      }

      respond_to do |format|
        format.json { render json: auth_token, created_user }
      end
    else
      respond_to do |format|
        format.json { render json: { errors: user.errors.full_messages }, status: :unprocessable_entity }
      end
    end
  end

问题出在成功路径上。当我尝试运行测试时,它给了我这个错误。

错误:

SyntaxError:
   /Users/Desktop/Work/ping-party/app/controllers/api/v1/users_controller.rb:23: syntax error, unexpected '}', expecting =>
   /Users/Desktop/Work/ping-party/app/controllers/api/v1/users_controller.rb:29: syntax error, unexpected keyword_end, expecting '}'
   /Users/Desktop/Work/ping-party/app/controllers/api/v1/users_controller.rb:37: syntax error, unexpected keyword_end, expecting '}'

测试:

context "POST /v1/users" do
it "create a new user" do
  post '/api/v1/users',
    params: {
      user: {
        email: "test@idea.com",
        password: "password123"
      }
    }

  res = JSON.parse(response.body)
  binding.pry
  expect(res).to include("jwt")
  expect(res).to include("user")
  expect(User.count).to eq(1)
end
end

它说有一个语法错误,但在我的一生中,我看不出我做错了什么。任何人都可以帮忙吗?谢谢。

【问题讨论】:

    标签: ruby-on-rails json ruby


    【解决方案1】:

    问题出在这里:

    render json: auth_token, created_user
    

    语法不正确。可能(根据你的测试)你想要这样的东西:

    render json: { user: created_user, jwt: auth_token.token)
    

    More info.

    【讨论】:

    • 感谢您的帮助。尝试此操作时出现此错误: NoMethodError: undefined method `to_h' for #<:authtoken:0x007fe79b2f2a80> 你的意思是? to_s
    • 完美。谢谢@mudasobwa
    • 请检查更新。我从未使用过 knock 库,我想您可能会自己弄清楚如何从 AuthToken 实例中获取 jwt。现在它可以工作了。
    【解决方案2】:

    您可以将 auth_token 和 created_user 存储在哈希中:

    auth_token = Knock::AuthToken.new(payload: { sub: user.id })
    created_user = {
      userEmail: user.email,
      userID:    user.id
    }
    output = { auth_token: auth_token, created_user: created_user }
    

    ...

    format.json { render json: output }
    

    然后rails可以像json一样渲染输出。

    【讨论】:

    • 测试清楚地表明响应应该有键 "user""jwt"
    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多