I am trying to get the user registration endpoint setting for my rails application so that I can access the application features in the iOS version. I went ahead, and namespaced my API, and so far have managed to get user authentication using Devise and JWT.
This is great, but I also need the ability to register a user through the API. To be honest, I have no idea how to implement this correctly. Several GOogle servlets call outdated articles , use an outdated token, authenticate , or never respond.
The following is the code that I believe is most relevant to this issue:
routes.rb (section with names for API)
namespace :api do namespace :v1 do devise_for :users, controllers: { registrations: 'api/v1/registrations' } resources :classrooms resources :notifications end end end
registrations_controller.rb (API contorller)
class Api::V1::RegistrationsController < Devise::RegistrationsController respond_to :json def create if params[:email].nil? render :status => 400, :json => {:message => 'User request must contain the user email.'} return elsif params[:password].nil? render :status => 400, :json => {:message => 'User request must contain the user password.'} return end if params[:email] duplicate_user = User.find_by_email(params[:email]) unless duplicate_user.nil? render :status => 409, :json => {:message => 'Duplicate email. A user already exists with that email address.'} return end end @user = User.create(user_params) if @user.save! render :json => {:user => @user} else render :status => 400, :json => {:message => @user.errors.full_messages} end end private
Registration Endpoint
http://localhost:3000/api/v1/users
Postman Sample Response
{ "message": [ "Email can't be blank", "Password can't be blank", "Access code is invalid [Beta]." ] }
Any help would be greatly appreciated as I really want to know more (and make it work!).
UPDATE 1
This is what I get on the server after creating a mail request to create a user ...
Started POST "/api/v1/users" for 127.0.0.1 at 2017-02-22 09:22:11 -0800 Processing by Api::V1::RegistrationsController#create as */* Parameters: {"user"=>{"email"=>" user@sampleapi.com ", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "access_code"=>"uiux"}} User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" IS NULL LIMIT $1 [["LIMIT", 1]] Completed 400 Bad Request in 2ms (Views: 0.2ms | ActiveRecord: 0.4ms)
Updated Registrations_controller
class Api::V1::RegistrationsController < Devise::RegistrationsController before_action :configure_sign_up_params, only: [:create] respond_to :json def create @user = build_resource(sign_up_params) if @user.persisted? # We know that the user has been persisted to the database, so now we can create our empty profile if resource.active_for_authentication? sign_up(:user, @user) render :json => {:user => @user} else expire_data_after_sign_in! render :json => {:message => 'signed_up_but_#{@user.inactive_message}'} end else if params[:user][:email].nil? render :status => 400, :json => {:message => 'User request must contain the user email.'} return elsif params[:user][:password].nil? render :status => 400, :json => {:message => 'User request must contain the user password.'} return end if params[:user][:email] duplicate_user = User.find_by_email(params[:email]) unless duplicate_user.nil? render :status => 409, :json => {:message => 'Duplicate email. A user already exists with that email address.'} return end end render :status => 400, :json => {:message => resource.errors.full_messages} end end protected # If you have extra params to permit, append them to the sanitizer. def configure_sign_up_params devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute, :first_name, :last_name, :access_code]) end end
I am sure that my main problem at the moment is the format of my parameters, so any push in the right direction for this would be wonderful. I found this post , but it's hard for me to understand what got their API to work ...