【问题标题】:Trying to pull data from params object in Rails API using JSON尝试使用 JSON 从 Rails API 中的 params 对象中提取数据
【发布时间】:2015-07-24 01:31:40
【问题描述】:

使用 Rspec,我正在尝试构建一个规范来测试一些基本的 http 请求。我在某个地方犯了一个菜鸟错误,需要帮助才能找到它。

我故意让规范失败并产生无意义的期望,因此错误消息会告诉我我得到了什么——一旦我弄清楚了,我会纠正期望:

  user = create(:member)
  json_data = {email: user.email, password: user.password}.to_json
  post "api/v1/users/sign_in", json_data, format: :json
  expect(last_response.body).to eq "foobar"

api/v1/users/sign_in 路由到以下控制器:

class API::V1::SessionsController < Devise::SessionsController
  respond_to :json
  def create
    render text: params
  end
end

这给出了错误:

预期:“foobar” 得到:"{\"{\\"email\\":\\"7abdiel_roob@smithrau.biz\\",\\"密码\\":\\"12345678\\"}\"=>无, \"action\"=>\"create\", \"controller\"=>\"api/v1/sessions\"}"

好的很好。我的数据正在到达服务器,服务器将其发回,这就是我想要的。在我的下一步中,我尝试获取电子邮件。我将控制器更改为

class API::V1::SessionsController < Devise::SessionsController
   respond_to :json
   def create
      render text: params[:email]
    end
 end

我得到了

预期:“foobar” 得到:“”

在我看来,params 哈希使用我在请求中发送的 JSon 数据作为键的名称,而不是实际的值。或者也许这是一个 strong_params 的事情?我已经尝试了很多东西,但似乎无法从 params 对象中提取我想要的数据。

【问题讨论】:

  • 这里的问题是您尝试访问 JSON 对象,就好像它是普通参数一样,我建议您解码参数然后正常访问您的电子邮件
  • @Kiloreux,Rails 会自动将 JSON 格式请求的主体解码为 params 哈希。你不应该尝试自己解码——你只是做错了。

标签: ruby-on-rails json ruby-on-rails-4 strong-parameters


【解决方案1】:

发生的情况是您对您在规范中发送的 JSON 数据进行了双重编码。

json_data = {email: user.email, password: user.password}
post "api/v1/users/sign_in", json_data, format: :json

RSpec 会自动为您将请求正文编码为 JSON。

【讨论】:

  • 做到了,谢谢。如何将其设置为答案?
  • 点击投票上/下按钮下方的检查
猜你喜欢
  • 2013-09-26
  • 1970-01-01
  • 2013-09-12
  • 2018-12-29
  • 2020-06-02
  • 2019-08-23
  • 2020-05-08
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多