Upgrading and creating new virtualbox vagrant boxes from the standard precise32 box

Problem

You would like to use a current version of a Virtualbox vagrant box, based on the official precise32 box, like saucy32.

Solution

  • Build your first vagrant box using the precise32 box
  • Install any packages that you need
  • Upgrade your distribution by doing the following:
    1. Make sure that the package update-manager-core is installed and install it if it isn’t:
      sudo apt-get install update-manager-core
    2. Change the prompt from lts to normal in the file /etc/update-manager/release-upgrades:
      sudo vi /etc/update-manager/release-upgrades
      Prompt=normal
    3. And upgrade to the next version by doing:
    4. sudo do-release-upgrade -d
  • Repeat the procedure for the version you want
  • Change the hostname to the current version:
    sudo vi /etc/hostname
    sudo vi /etc/hosts
    quantal32
  • Logout from the box and package it:
    vagrant package --output /home/path_to_new/packagename.box
  • Add the box to the list of boxes:
    vagrant box add quantal32 /home/path_to_new/packagename.box
  • You can use your new box now in a new vagrant box:

    vagrant init --packagename.box

Session secret should not be included in version control near line …

Problem

After using brakeman to test for security issues in your rails application you get the following warning about the config/initializers/secret_token.rb file:

Session secret should not be included in version control near line xx

Solution

Since you may have already pushed the original secret_token.rb in your version control you may need to do the following.

  • Make a copy of the file : cp config/initializers/secret_token.rb config/initializers/copy_of_secret_token.rb
  • Delete the original file that is also on your version control: rm config/initializers/secret_token.rb
  • Add it to .gitgnore
  • Commit your changes and push to your version control: git commit -a -m “remove secret token and include it in .gitignore”, git push (origin master)
  • Create a new secret key by running: rake secret
  • Copy the value from above to the file config/initializers/copy_of_secret_token.rb replacing the original value of config.secret_key_base
  • Rename the file to secret_token.rb again: mv config/initializers/copy_of_secret_token.rb config/initializers/secret_token.rb
  • Check that the new file is not listed in git when you do : git status

fatal: cannot exec ‘/tmp/…/git-ssh.sh’: Permission denied – Capistrano, Dreamhost, permission denied for git-ssh.sh

Problem

When trying to use the new Capistrano 3.x to set up your rails project in a dreamhost account, you get the following error complaining that the git-ssh.sh script copied to your account by capistrano cannot be executed as the permission is denied:

fatal: cannot exec '/tmp/example.com/git-ssh.sh': Permission denied

Solution

It seems that Dreamhost, and quite possibly other hosting providers are not allowing executables from the /tmp directory, which is where Capistrano places the git-ssh.sh script. So in order to be able to execute the script you can change the directory where the script is copied in the first place and put it in your home directory. You can do that by adding the following to the config/deploy.rb file:

set :tmp_dir, "/home/dh_user_name/tmp"

Creating an alias that migrates both development and test databases in rails project

Problem

In your rails project very often, after creating a new migration, you have to run the migration in the development database and then in the test database.

Solution

A neat way to combine both these steps as one, taken from the book Rails 4 in Action, is to create an alias in your ~/.bashrc configuration file with the following, so that you only have to run migrate after each migration that would apply the migration in both development and test databases:

alias migrate='bin/rake db:migrate && bin/rake db:test:prepare'

build association for has_one in rails

Problem

You would like to use the build method for creating an association (details) that belongs to another assocation (user).
When the user has many details then you would have something like the following:

class User < ActiveRecord::Base
  has_many :details
end

then you could do:

User.details.build

but when you have:

class User < ActiveRecord::Base
  has_one :detail
end

would throw an error:

NoMethodError: undefined method `build' ...

Solution

In order to be able to use the build in a has_one relation you would need to use like:

User.build_detail

libv8 error in new rails installation

Problem

You are getting a libv8 installation error in a new rails 4.0 application in an older linux installation

An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue.
Make sure that `gem install libv8 -v '3.16.14.3'` succeeds before bundling.

Solution

This is causes by the latest gem version of the therubyracer dependency on the libv8.
You can get over it by specifying version 0.11.4 for the gem as in:

gem 'therubyracer', '~> 0.11.4', platforms: :ruby

and then running bundle install again.

db:migrate or db:schema:load for Rails project with many migations

Problem

You have a rails application with many migrations build over time and you want to recreate the database from start. Should you be using the normal way of running the migrations (db:migrate) or the one that loads the actual schema to the database (db:schema:load).

Solution

According to the book Rails 4 in Action (MEAP v9 page 146) :

The bin/rake db:migrate task runs the migrations and then dumps the structure of the database to a file called db/schema.rb. This structure allows you to restore your database using the bin/rake db:schema:load task if you wish, which is better than running all the migrations on a large project again! NOTE

NOTE: Large projects can have hundreds of migrations, which may not run due to changes in the system over time. It’s best to just use the bin/rake db:schema:load.

Disabling SQL logging in rails development

Problem

You are working on a new feature that outputs a lot of SQL code in your log file so it’s difficult to see what else is happening, and you would like to disable the SQL logging in your development environment temporarily.

Solution

You can add the following to your config/application.rb file:

if Rails.env.development?
  ActiveRecord::Base.logger = Logger.new('/dev/null')
end

Thanks to the solution here

Interrupting a cucumber test

Problem

When you interrupt a cucumber test, usualy by presssing Ctrl+C twice, the database tables are not truncated, so you consequently could have a problem with duplicates records.

Solution

To make sure that the database is clear before running the test again run the following tasks to clear the database and clone it again:

rake db:test:purge
rake db:test:clone