尝试使用 JSON 从 Rails API 中的参数对象中提取数据

Trying to pull data from params object in Rails API using JSON

使用 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

这给出了错误:

expected: "foobar" got: "{\"{\"email\":\"7abdiel_roob@smithrau.biz\",\"password\":\"12345678\"}\"=>nil, \"action\"=>\"create\", \"controller\"=>\"api/v1/sessions\"}"

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

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

我得到

expected: "foobar" got: " "

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

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

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

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