I had some time this week and I had to try out the
Rails 4 and
Ruby 2. That's exactly what I did !
I did not try out Key based Cache Expirations or Etag stuff. But I did try out some
Server Sent Events stuff. And it went pretty well.
I started out installing Ruby 2 with
rvm (I use
rvm and don't use
to rbenv for some reason). I got through installing 2.0, but when I tried to use a specific gem_set for a test application, I got an error from
Rubinius for some odd reason. It said that
rbx was to be installed. Somehow it messed up the whole setup and I had to do away with gem_sets. I also had to remove the rbx* installation directory because it was bursting warnings to the console every time the
rvm was set.
You must
upgrade RVM :)
This
benchmark is a great read for 2.0
I wrote the version to the
.ruby-version file and that was the start of the project.
I wanted to do something which had some real time communication. Tic Tac Toe seemed to be a nice choice.
There was then this weird problem with
sqlite3. It, for some odd reason, could not find the native binding of sqlite3. The path was correctly set but it just could not find the path. I had to spend some hours of debugging to find this out and a lot of googling !
The error was
/usr/
local
/share/gems/gems/sqlite
3
-1.3
.
7
/lib/sqlite
3
.rb:
6:
in `require': cannot load such file -- sqlite
3
/sqlite
3
_ruby (LoadError)
This
post saved me at last. Seems like we have to change the actual file of the gem to get this thing running.
In the case of
rvm, the file would be under
~/.rvm/gems/ruby-2.0.0-p247/gems/sqlite3-1.3.8/lib/sqlite3.rb
and you will have to change the loading locations relative like
~/.rvm/gems/ruby-2.0.0-p247/gems/sqlite3-X-X-X/ext/sqlite3/sqlite3_native
Once this is done, rails
finds it and loads it. This, I think, is
NOT good for a
Continous Integration Server.
Server Side Events came next. I went through this
excellent post on how to get started with SSE. I managed to add Redis pub/sub with SSE after looking through this
post. And ultimately used some Thread Processing to get it less Non Blocking as per this
post.
Another problem I had was with the servers. I started with
Unicorn which was a bad choice. Unicorn kills connections because it is meant for fast processing. For persistent connections, we need to have
Puma or
Rainbows!
I started using Puma but I did the mistake of not putting
config.preload_frameworks = true
config.allow_concurrency = true
in the application
.rb file. Only one request was permitted because of this flaw. This is to be removed later (I have no idea why this is not default ?).
But that did not solve my problems. Puma constantly gave me errors like
ThreadError: Attempt to unlock a mutex which is locked by another thread
which is not good. It never called the ensure block (don't know why) and I seriously doubt the sockets to be open :|
Thats when I tried Rainbows! I added the rainbow
.rb file for server config and started the server. It worked great for me !
I also understood that attr_accesible is no more for rails and its all about
Strong Parameters.
I tried adding
rails-api to the project (this was my first time). It was only after some time that I realized that the stack for rails-
api removes the Rack for Session handling because it aims for the Processing to be as less as possible
Rack::Session::Cookie
I was working with an existing Rails application and I did not want this feature. I tried adding
config.api_only = false
to the application
.rb file. But that did not help me.
I had to add the particular require for the
api for this to work in the Gemfile
gem 'rails-api', require: 'rails-api/action_controller/api'
I wanted to try my bit with the
state machine and I managed to write this inside
Concerns.
The
POC is still incomplete, but I loved doing this after a long time !