Hello,
I’ve the question about the “devise_token_auth” gem, authentication in Ruby on Rails application (API) and deploying it to Heroku.
Introduction
What I did:
1/ Created an --api --database=postgresql app
2/ Added some required gems like
gem ‘devise_token_auth’ gem ‘omniauth’ gem ‘rack-cors’, :require => ‘rack/cors’
``
3/ Added CORS
4/ Added User model
rails generate devise_token_auth:install User auth
``
and modified my class definition
class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable,
:validatable, :omniauthable include DeviseTokenAuth::Concerns::User end
``
5/ Added the following statement into the seed.rb file
User.create(email: ‘user@example.com’, nickname: ‘UOne’, name: ‘User One’, password: “monkey67”)
``
6/ Initialized git repo, pushed it, initialized heroku app and pushed this app using the commands:
heroku signin heroku keys:add heroku create git push heroku master heroku run rake db:create heroku run rake db:migrate heroku run rake db:seed
``
So, this was the first deploy. Everything works as expected. When I send a request using RESTclient in firefox:
Request type: POST on “https://myapp.herokuapp.com/auth/sign_in” Content-Type: application/x-www-form-urlencoded; charset=utf-8
Body: email=user%40example.com&password=monkey67
``
I got the response 200(OK) with the token. It is OK.
Further steps are:
7/ Added a new user in seed.rb file, the new file looks as follows
User.create(email: ‘user@example.com’, nickname: ‘UOne’, name: ‘User One’, password: “monkey67”) User.create(email: ‘user2@example.com’, nickname: ‘UTwo’, name: ‘User two’, password: “monkey69”)
``
8/ Pushed the changes to git repo and then to heroku
… git push git push heroku master heroku run rake db:seed …
``
The problem
When I send a request using RESTclient in firefox for the new user:
Request type: POST on “https://hereismyapp.herokuapp.com/auth/sign_in” Content-Type: application/x-www-form-urlencoded; charset=utf-8
Body: email=user2%40example.com&password=monkey69
``
I got the response 200(OK) with the token. It is OK.
The part of heroku logs for the second user
Started POST “/auth/sign_in” for 94.254.189.86 at 2017-05-18 21:09:33 +0000 User Load (1.1ms) SELECT “users”.* FROM “users” WHERE (email = ‘user2@example.com’ AND provider=‘email’) ORDER BY “users”.“id” ASC LIMIT $1 [[“LIMIT”, 1]] Processing by DeviseTokenAuth::SessionsController#create as / Parameters: {“email”=>“user2@example.com”, “password”=>“[FILTERED]”} … Completed 200 OK in 492ms (Views: 0.5ms | ActiveRecord: 36.8ms) at=info method=POST path=“/auth/sign_in” host=hereismyapp.herokuapp.com request_id=df397a4c-ea1e-4c90-8d40-f2382dfab1f8 fwd=“94.254.189.86” > dyno=web.1 connect=3ms service=500ms status=200 bytes=580 protocol=https
``
However, when I do the same thing for the old user that was in my seed.rb file from the beginning the response code is 500 (Internal server error).
I would like to say that both records are in my db on heroku.
The part of heroku logs for the first user
Started POST “/auth/sign_in” for 94.254.189.86 at 2017-05-18 21:09:43 +0000 User Load (1.0ms) SELECT “users”.* FROM “users” WHERE (email = ‘user@example.com’ AND provider=‘email’) ORDER BY “users”.“id” ASC LIMIT $1 [[“LIMIT”, 1]] IndexError (string not matched): at=info method=POST path=“/auth/sign_in” host=hereismyapp.herokuapp.com request_id=f2e57933-1220-4e55-9554-2496638a1c9f fwd=“94.254.189.86” dyno=web.1 connect=1ms service=162ms status=500 bytes=189 protocol=https
``
How to resolve this issue?
I had to clean my db on heroku using the commands
heroku pg:reset DATABASE heroku run rake db:migrate
``
The main question
Why do I have to clean my database using pg:reset command to make my api work for the all data. Why is that? Is it the correct behaviour?