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

时间:2015-07-24 01:31:41

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

使用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 \\“,\\”password \\“:\\”12345678 \\“} \”=&gt; nil,   \“action \”=&gt; \“create \”,\“controller \”=&gt; \“api / v1 / sessions \”}“

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

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

我得到了

  

预期:“foobar”               得到了:“”

我向我看来,params哈希使用我在请求中发送的JSOn数据作为密钥的名称,而不是实际值。或者这可能是一个强烈的事情?我尝试了很多东西,似乎无法从params对象中提取出我想要的数据。

1 个答案:

答案 0 :(得分:1)

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

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

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