У меня есть следующий код в users_controller.rb
:
def create
params = user_params
x = 1
render :json => { :message => "New user created!"}, :status => :ok
end
private
def user_params
params.permit!
end
Очевидно, что сейчас это мало что дает.У меня нет фильтров до или после него.
У меня также есть следующий тестовый код:
RSpec.describe UsersController, type: :controller do
fixtures :users, :clients
include AuthHelper
before do
@request.headers["Content-Type"] = 'application/json'
@request.headers["Accept"] = 'application/json'
@default_registered_users = 3
end
describe '#create' do
context 'a user with a valid authorization token' do
before do
init_headers_for_admin
end
context 'with a valid set of input parameters' do
before do
@new_user = {
:username => 'blorp',
:email => 'blorp@blorpville.com',
:role => 'user',
:name => 'Blorp Blorperson'
}.as_json
end
it 'should create a new user' do
post :create, params: @new_user
expect(response).to have_http_status(:ok)
end
end
end
Внутри spec_helper.rb
у меня есть следующие вспомогательные функции:
def init_headers_for_admin
# Manually added to the database, this username/password is good.
init_headers_with_login 'scottj', '771625142'
end
def init_headers_with_login (username, password)
auth_token = login username, password
init_headers_with_auth_token auth_token
end
def login (username, password)
unless @request
return login_for_integration_tests username, password
end
old_controller = @controller
@controller = UsersController.new
get_headers_for_login(username, password).each { |key, value|
@request.headers[key] = value
}
post :login
response_body = JSON.parse response.body
@controller = old_controller
response_body['auth_token']
end
def login_for_integration_tests(username, password)
headers = get_headers_for_login username, password
post '/login', headers: headers
response_body = JSON.parse response.body
response_body['auth_token']
end
def get_headers_for_login(username, password)
combined_login_password = username + ":" + password
encoded_username_password =. Base64.encode64(combined_login_password)
headers = get_default_headers
headers['X-Api-Key'] = Client.find_by_id(1234).api_key
headers['Authorization'] = 'Basic ' + encoded_username_password
headers
end
Когда я запускаю тест и устанавливаю точку останова в коде, в котором я установил x=1
, я получаю следующее значение для переменной params
: {"controller"=>"users", "action"=>"create", "user"=><ActionController::Parameters {} permitted: true>}
Обратите внимание, какusername
, name
, email
и role
отсутствуют, но присутствует загадочный хэш user
, но он не заполнен.
ПроблемаЯ вижу, что я не могу заставить users_controller
фактически передавать какие-либо параметры, независимо от того, что я делаю.Сначала я подумал, что это проблема с неправильным разрешением параметров, поэтому params.permit!
, который я выполняю в users_controller
.Это, похоже, не решает проблему.
Может кто-нибудь сказать мне, что я здесь не так делаю?Я довольно долго бился головой о стену, пытаясь понять это.