Как десериализовать параметры, полученные в виде строки JSON в контроллере? - PullRequest
1 голос
/ 19 марта 2019

Я использую Rails для написания контроллера, получающего JSON в качестве своих параметров, и затем тестирую его с помощью спецификации запроса Rspec.

controller:

class API::UserController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
    end

  private

  def user_params
    params.require(:user).permit(:username, :email, :name, :password_digest)
  end
end

spec:

RSpec.describe "User creation", type: :request do
  def create_user_request
    params = { user: build(:user), format: :json }
    post api_users_path, params: params.to_json
  end

  it 'should create a new user' do
    expect { create_user_request }.to change { User.count }.by(1)
end

Но это не так:

     Failure/Error: params.require(:user).permit(:username, :name, :email, :password_digest)

     ActionController::ParameterMissing:
       param is missing or the value is empty: user

Я думаю, проблема в том, что params в контроллере представляет собой сериализованный объект JSON в виде строки.Если я заменю params: params.to_json на params: params в моей спецификации, тогда параметры user станут строкой "#<User:0x.....>".

Как сделать так, чтобы спецификация и контроллер хорошо играли вместе?

1 Ответ

1 голос
/ 19 марта 2019

Я думаю, что первая проблема заключается в том, что вам нужно преобразовать модель в хеш (а не в ее строку).Самый простой способ сделать это - использовать .attributes, т. Е.

build(:user).attributes

. Я также не уверен, что вы должны передавать format: :json как часть параметров, но я думаю, что это будет зависеть от того, какая версиярельсы, rspec и т. д. вы используете, но для рельсов 4 у меня работает

post api_users_path, user: build(:user).attributes, format: :json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...