Learn Ruby on Rails by seeing all the ruby code behind the rails (and ruby) magic you use.
Currently works for:
- accessors (
attr_reader
,attr_writer
,attr_accessor
) - associations (
belongs_to
andhas_one
only so far)
Also note that for associations, the only options that work so far are class_name
, readonly
, primary_key
, foreign_key
and conditions
.
Coming soon:
- All rails magic / helpers
- Annotate your rails app with a single command (e.g. associations code shown in each model)
Add this line to your application's Gemfile:
gem 'learn_rails'
And then execute:
$ bundle
Or install it yourself as:
$ gem install learn_rails
This gem installs an executable called learn
and a general purpose command called rails
, so all you need to do is go to the terminal and type:
$ learn rails the_rails_magic_I_want_to_learn_about
Say you want to know what the attr_accessor :color, :size
line in one of the models in your code really does. Type the following terminal command:
$ learn rails attr_accessor :color, :size
The gem will now print the following ruby code in your terminal output:
# def color
# @color
# end
#
# def color=(value)
# @color = value
# end
#
# def size
# @size
# end
#
# def size=(value)
# @size = value
# end
Sweet!
Maybe you also want to know a bit more about the association has_one :task, class_name: "ToDo"
in your user.rb
model. You would now type:
$ learn rails user has_one :task, class_name: "ToDo"
(Note that we included the model name in the command, because our gem needs it to generate the ruby code!)
This is the terminal output you'll see:
# def task(force_reload = false)
# @task = nil if force_reload
# @task ||= ToDo.find_by_user_id(self.id)
# end
#
# def task=(task)
# task.user_id = self.id
# task.save
# end
#
# def build_task(attributes = {})
# attributes[:user_id] = self.id
# ToDo.new(attributes)
# end
#
# def create_task(attributes = {})
# attributes[:user_id] = self.id
# ToDo.create(attributes)
# end
#
# def create_task!(attributes = {})
# attributes[:user_id] = self.id
# ToDo.create!(attributes)
# end
Happy learning!
-
Always use the new ruby hash syntax for the options you specify. So type
class_name: "ToDo"
and notclass_name => "ToDo"
. -
Don't forget to prepend your associations with the ruby model they are defined in (see example above).
Don't worry too much about rule 2 though: If you forget to give the model name when we need it, we'll ask for it. And when you give it when we don't need it, we'll ignore it.
Accessors:
$ learn rails attr_reader :as, :many, :attributes, :as, :you, :want
$ learn rails attr_writer :as, :many, :attributes, :as, :you, :want
$ learn rails attr_accessor :as, :many, :attributes, :as, :you, :want
Associations:
$ learn rails mymodelname belongs_to :associate
$ learn rails mymodelname has_one :associate
Options for each association: class_name: "Whatever"
, foreign_key: "foreign_id"
, primary_id: "primary_id"
, readonly: true
, conditions: { anykey: 'anyvalue' }
Comments and feedback are very welcome on our github issues page.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request