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

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

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

我故意使规范以胡扯的期望失败,因此错误消息将告诉我我要得到的内容-一旦我弄清楚了,我将纠正期望:

1
2
3
4
  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路由到以下控制器:

1
2
3
4
5
6
class API::V1::SessionsController < Devise::SessionsController
  respond_to :json
  def create
    render text: params
  end
end

这给出了错误:

expected:"foobar"
got:"{"{\\"email\\":\\"[email protected]\\",\\"password\\":\\"12345678\\"}"=>nil,
"action"=>"create", "controller"=>"api/v1/sessions"}"

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

1
2
3
4
5
6
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数据进行双重编码。

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

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