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.