POSTS
Scaffolding has changed in Rails 2.0: Has it become un-Agile?
BlogThis 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