1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
My Contact Details
My Books
My Projects
Class vs Instance Variables
Delayed Job Best Practices
Read my new article on Site Point about Delayed Job Best Practices
You Don't Have to Be Afraid to Test Your UI - Page Object Pattern to the Rescue
Introduction
Many software engineers do not write tests for their UI because they have a good reason not to. Firstly, they believe that UI changes frequently, so any test would have been vulnerable to frequent changes. Secondly, they do not know about the Page Object Pattern.
United States, Counties, Cities, Zips CSV & Ruby Loading Code
I just wanted to have the United States, their Counties, the Cities in the Counties and the Zip codes in each City in CSV format. But I wanted that normalized. In different CSVs. So, here it is. You can also find here some Ruby on Rails sample code that loads these files. Primitive stuff, but sometimes useful.
Using String Column Type for Migrations
Ruby on Rails migrations are used to create the necessary tables inside our database. One of the most frequently used column type is string
.
Here is an example of an ActiveRecord::Migration
that uses this type:
The Clean Coder - a Code of Conduct for Professional Programmers - R. Martin (Pearson)
I have recently finished the book “The Clean Coder - A Code of Conduct for Professional Programmers - R. Martin (Pearson, 2011) BBS”. Here is my short review:
Overall: Fantastic. Worth reading for every developer that wants to become professional.
My Notes and Highlights
Chapter 1 - Professionalism
- Professionalism is a marker of responsibility and accountability.
- It is better to make your manager unhappy rather than your manager customers.
Twitter Bootstrap 2 Modal Scrolling Problem | Why Capybara/selenium Cannot Locate Your Visible Buttons
Twitter Bootstrap 2 has a bug while on modal dialogs. The page does not scroll as expected. So, if the browser window is not wide/tall enough to display the whole modal dialog content, the scroll bars do not make it appear.
The bug is described here:
And the answer is given a little bit below that:
This problem does not occur with jQuery modals neither with Twitter Bootstrap 3.
I am using Ruby on Rails and the less-rails-bootstrap
gem.
In order to fix the problem for my current application, and instead of moving to Twitter Bootstrap 3 or to jQuery, I have decided to fix the problem in the gem
Here is the fix:
gem 'less-rails-bootstrap', :git => 'https://github.com/pmatsinopoulos/less-rails-bootstrap.git', :branch => 'bug-fix-modal-scrolling'
Important Note This bug influences your capybara/selenium tests, because elements that are normally visible, while the browser is maximized, they cannot be located by selenium and they are reported as non-visible and cannot be interacted with, if the window browser is not open enough to display the whole modal dialog.
Model Properties - Styling
I usually come across people asking what is the preferred way of laying out the properties of a model and, in fact, of an ActiveRecord model. Shall we put first the validations and then the associations? Or first the associations and then the validations? Or shall we put first the callbacks?
One can google for rails style guide
. Will basically find only this:
which is a good resource. But is not complete.
My Rails Model Style Guidelines
we are talking here about Rails 3
Here is the list of my styling guidelines and which I use whenever I am writing a Model.
Including vs Extending a Module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
But you can also include
or extend
a module
in another module
too. Read this gist by
pglombardo who has kindly appended to the above
piece of code.
How to Define and Use Class-level Variables While Mixing in Modules
There are sometimes that you might want to use class-level variables in a reusable module
. How will you do that? Here is a sample ruby program that does that:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
If you run the above ruby script, you will get the following output:
1 2 3 4 5 6 7 8 9 10 |
|
In the above example, we keep a class level Set
of symbols (@cached_keys
). We want every class
that mixes in Cacheable
to have its own instance of that Set
.