POSTS

Scaffolding has changed in Rails 2.0: Has it become un-Agile?

Blog

This is the mail that I sent to Rails-list which describes my issues around the Rails scaffolding in Rails 2.0.

Hello,

I’ve read the (many) re-posts about problems around scaffolding in Rails 2.0 and have followed a number of tutorials and fully understand “how to scaffold” from a technical perspective, but I don’t understand the mindset of how to use the new scaffolding. It seems like a productivity- / agility- regress and I’m thinking I may have failed to properly grok the new setup. In the interest of full disclosure, I’m coming back to Rails after being in other toolkits for about 9 months.

Thanks to the intrepid work of Sean Lynch at ( http://fairleads.blogspot.com/2007/12/rails-20-and-scaffolding-step-by-step.html ) I found a tutorial that would familiarize me with the raw “how to scaffold” material.

I followed his tutorial’s step of:

ruby script/generate scaffold Movie

Great! From that point I filled in the “columns” in the migration as I had done in Rails 1.x. All I should need to do is run rake db:migrate and try adding a new record via the dynamically-created view.

When I started the server and navigated /movies I had the “create new” button. When I pushed that button there were no text widgets to enter despite having defined the columns that corresponded to said widgets having been added to the migration ( I have a lengthy blog post about how my diagnostics went, for anyone else’s edification ). In short the scaffold that had been created knew nothing of the columns I had added in the migration and, as such, the ’new’ view had no widgets.

This struck me as well, wrong. On Sean’s post another user confirms the same experience. I have tried it with sqlite3 / mysql / postgres connectors.

Research showed that the scaffold had remained static relative to the time that I had done the original aenemic invocation. Per script/generate scaffold --help:

./script/generate scaffold post` # no attributes, view will be anemic

To fix this I had to re-issue the script/generate command with all the attributes in “final draft” mode ( `script/generate scaffold movie title:string text:description one_sheet_url:string’ ) and then over-write the old templates ( output stored below, for legibility, Fig. 1).

The solution implies:

  • You have to get the script/generate command’s “attributes” arguments perfect at time of creation OR
  • You do this overwriting thing that I describe below.

As I recall Rails 1.x’s dynamic scaffolding allowed us to use a scaffold flexibly strictly based on migrations and rake db:migrate. This flexibility allowed us to “sketch” ideas very rapidly. Or is it considered a “Good Thing” that you get a “perfected” generate scaffold command at some point? If so, what’s the reasoning? Am I missing some sort of rake command that “refreshes” the scaffold templates?

Based on the comments at Sean’s site and some of the questions in the comments to DHH’s Rails 2. announcement I think there are others grappling with this quandry as well. Can anyone help?

Steven

Fig. 1

    bash-3.2$ script/generate scaffold movie title:string text:description one_sheet_url:string
          exists  app/models/
          exists  app/controllers/
          exists  app/helpers/
          exists  app/views/movies
          exists  app/views/layouts/
          exists  test/functional/
          exists  test/unit/
    overwrite app/views/movies/index.html.erb? (enter "h" for help) [Ynaqdh] y
           force  app/views/movies/index.html.erb
    overwrite app/views/movies/show.html.erb? (enter "h" for help) [Ynaqdh] y
           force  app/views/movies/show.html.erb
    overwrite app/views/movies/new.html.erb? (enter "h" for help) [Ynaqdh] y
           force  app/views/movies/new.html.erb
    overwrite app/views/movies/edit.html.erb? (enter "h" for help) [Ynaqdh] y
           force  app/views/movies/edit.html.erb
       identical  app/views/layouts/movies.html.erb
       identical  public/stylesheets/scaffold.css
      dependency  model
          exists    app/models/
          exists    test/unit/
          exists    test/fixtures/
       identical    app/models/movie.rb
       identical    test/unit/movie_test.rb
            skip    test/fixtures/movies.yml
          exists    db/migrate
    Another migration is already named create_movies: db/migrate/001_create_movies.rb