srboisvert
srboisvert

Reputation: 12749

How do you read an existing Rails project?

When you start working on an existing Rails project what are the steps that you take to understand the code? Where do you start? What do you use to get a high level view before drilling down into the controllers, models, helpers and views? Do you have any specific techniques, tricks or tools that help speed up the process?

Please don't respond with "Learn Rails & Ruby" (like one of the responses the last guy who asked this got - he also didn't get much response to his question so I thought I would ask again and prompt a bit more). I'm pretty comfortable with my own code. It's sorting other people's that does my head in and takes me a long time to grok.

Upvotes: 15

Views: 2490

Answers (10)

honktronic
honktronic

Reputation: 363

Unlike a lot of the people so far, I actually don't think tests are the place to start. I think they're too narrow, too focused. It'd be like trying to understand basic physics/mechanics by first zooming into intra-molecular forces and quantum mechanics. I also think you're relying too much on well-written tests, and in my experience, a lot of people don't write sufficient tests or write poor tests (which don't give an accurate sense of what the code should actually do).

1) I think the first thing to do is to understand what the hell the app actually does. Use it, at least long enough to build an idea of what its main purpose is and what the different types of data might be and which actions you can perform, and most importantly, why.

2) You need to step back and see the big picture. I think the best way to do that is by starting with schema.rb. This tells you a few really important things:

  • What is the vocabulary/concepts of this project. What does "User" actually mean in this app? Why does the app have both "User" and "Account" models and how are they different/related?
  • You could learn what models there are by looking in app/models but this will actually tell you what data each model holds.
  • Thanks to *_id fields, you'll learn the associations between the models, which helps you understand how it all fits together.

I'd follow this up by looking at each model's *.rb file for (hopefully) comments, validations, associations, and any additional logic relevant to each. Keep an eye out for regular ol' Ruby classes that might live in lib/.

3) I, personally, would then take a brief glance at routes.rb as it will tell you two key things: a brief survey of all of the actions in the app, and, if the routes and controllers/actions are well named and thought out, a quick sense of where different functionality might live.


At this point you're probably ready to dig into a specific thing you need to learn. Find the controller for the feature you're most interested in and crack it open. Start reading through the relevant actions, see which models are involved, and now maybe start cracking open tests if you want to.

Don't forget to use the rest of your tools: Ruby/Rails debuggers, browser dev tools, logs, etc.

Upvotes: 3

AdamK
AdamK

Reputation: 1199

Aside from the already posted tips of running specs, and decomposing the MVC, I also like:

rake routes

as another way to get a high-level view of all the routes into the app

./script/console

The rails irb console is still my favorite way to inspect models and model methods. Grab a few records and work with them in irb. I know it helps me during development and test.

Upvotes: 0

August Lilleaas
August Lilleaas

Reputation: 54593

  1. I run rake test in a terminal
  2. If the environment does not load, I take a look at the stack trace to figure out what's going on, and then I fix it so that the environment loads and run the tests again
  3. I boot the server and open the app in a browser. Clicking around.
  4. Start working with the tasks at hand.
  5. If the code rocks, I'm happy. If the code sucks, I hurt it for fun and profit.

Upvotes: 0

Matías Insaurralde
Matías Insaurralde

Reputation: 1222

Look at the documentation, there is pretty good documentation on some projects. It's a little bit hard to understand other's code, but try it...Read the code ;-)

Upvotes: -1

Hassan Schroeder
Hassan Schroeder

Reputation:

Run the tests. :-)

If you're lucky it'll have been built on RSpec, and that'll describe the behavior regardless of the implementation.

Upvotes: 1

Mike Woodhouse
Mike Woodhouse

Reputation: 52316

I can think of two reasons to be looking at an existing app with which I have no previous involvement: I need to make a change or I want to understand one or more aspects because I'm considering using them as input to changes I'm considering making to another app. I include reading-for-education/enlightenment in that second case.

A real benefit of the MVC pattern in particular, and many web apps in general is that they are fairly easily split into request/response pairs, which can to some extent be comprehended in isolation. So you can start with a single interaction and grow your understanding out from that.

When needing to modify or extend existing code, I should have a good idea of what the first change will be - if not then I probably shouldn't be fooling with the code yet! In a Rails app, the change is most likely to involve view, model or a combination of both and I should be able to identify the relevant items fairly quickly. If there are tests, I check that they run, then attempt to write a test that exposes the missing functionality and away we go. If there are no tests then it's a bit trickier - I'm going to worry that I might inadvertently break something: I'd consider adding tests to give myself a more confidence, which will in turn start to build some understanding of the area under study. I should fairly quickly be able to get into a red-green-refactor loop, picking up speed as I learn my way around.

Upvotes: 1

nakajima
nakajima

Reputation: 1872

Look at the models. If the app was written well, this should give you a picture of its domain model, which is where the interesting logic should live. I also look at the tests for the models.

The way that the controllers/views were implemented should be apparent just by using the Rails app and observing the URLs.

Unfortunately, there are many occasions where too much logic lives in controllers and even views. That means you'll have to take a look into those directories too. Doubley-unfortunate, tests for these layers tend to be much less clear.

Upvotes: 10

Can Berk Güder
Can Berk Güder

Reputation: 113310

First I use the app, noting the interesting controller and action names.

Then I start reading the code for these controllers, and for the relevant models when necessary. Views are usually less important.

Upvotes: 5

toddk
toddk

Reputation: 873

If the Rails project is in a somewhat stable state than I have always been a big fan of using the debugger to help navigate the code base. I'll fire up the browser and begin interacting with the app then target some piece of functionality and set a breakpoint at the beginning of the associated function. With that in place I just study the parameters going into the function and the value being returned to get a better understanding of what's going on. Once you get comfortable you can modify the functionality a little bit to ensure you understand what's going on. Just performing some static analysis on the code can be cumbersome! Good luck!

Upvotes: 1

Wayne Molina
Wayne Molina

Reputation: 19586

I would say take a look at the tests (or specs if the project uses RSpec) to get an idea at the high-level of what the application is supposed to do. Once you understand from the top level how the models/views/controllers are expected to behave, you can drill into the implementations.

Upvotes: 1

Related Questions