January 14, 2016
This blog is part of our Rails 5 series.
In Rails 4 some commands start with rails and some commands start with rake.
This could be quite confusing for people new to Rails. Let's see an example.
Our task is to write a database migration and then to run that migration.
rails g migration create_users
Above command creates a migration. Now we need to run that migration.
rake db:migrate
As you can see first command starts with rails and second command starts with
rake.
In order to consolidate them we can either use rails for everything or we can
use rake for everything.
Some favor using rake over rails. But an important feature missing in Rake
is the ability to pass arguments.
rails console development
In order to execute the above command using rake we will have to pass
console and development as arguments. We can pass these values using
environment variables. That would mean adding additional code in Rake task to
fetch right values and then only we will be able to invoke command
rails console development.
Rails core team decided to have
consistency by enabling rails command to support everything that rake does.
For example in Rails 5 commands like db:migrate, setup, test etc which are
part of rake command in Rails 4 are now being supported by rails command.
However you can still choose to use rake to run those commands similar to how
they were run in Rails 4. This is because Rails community has
introduced Rake Proxy
instead of completely moving the command options from rake to rails.
What happens internally is that when rails db:migrate command is executed,
Rails checks if db:migrate is something that rails natively supports or not.
In this case db:migrate is not natively supported by rails, so Rails
delegates the execution to Rake via Rake Proxy.
If you want to see all the commands that is supported by rails in Rails 5 then
you can get a long list of options by executing rails --help.
As rails command is now preferred over rake command, few rails namespaced
framework tasks started looking little odd.
$ rails rails:update
$ rails rails:template
$ rails rails:templates:copy
$ rails rails:update:configs
$ rails rails:update:bin
So, Rails team decided to change the namespace for these tasks from rails to
app.
$ rails app:update
$ rails app:template
$ rails app:templates:copy
$ rails app:update:configs
$ rails app:update:bin
Using rails rails:update will now give deprecation warning like:
DEPRECATION WARNING: Running update with the rails: namespace is deprecated in favor of app: namespace. Run bin/rails app:update instead.
In Rails 4, the routes are usually searched like this.
$ rake routes | grep pattern
There is an effort underway to have a Rails command which might work as shown below.
$ rails routes -g pattern
There is also an effort to enable lookup for controller like this.
$ rails routes -c some_controller
If this blog was helpful, check out our full blog archive.