Rails: How to run `rails generate scaffold` when the model already exists?

Ruby on-RailsRuby on-Rails-3

Ruby on-Rails Problem Overview


I'm new to Rails so my current project is in a weird state.

One of the first things I generated was a "Movie" model. I then started defining it in more detail, added a few methods, etc.

I now realize I should have generated it with rails generate scaffold to hook up things like the routing, views, controller, etc.

I tried to generate the scaffolding but I got an error saying a migration file with the same name already exists.

What's the best way for me to create scaffolding for my "Movie" now? (using rails 3)

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

TL;DR: rails g scaffold_controller <name>

Even though you already have a model, you can still generate the necessary controller and migration files by using the rails generate option. If you run rails generate -h you can see all of the options available to you.

Rails:
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  observer
  performance_test
  plugin
  resource
  scaffold
  scaffold_controller
  session_migration
  stylesheets

If you'd like to generate a controller scaffold for your model, see scaffold_controller. Just for clarity, here's the description on that:

> Stubs out a scaffolded controller and its views. Pass the model name, either CamelCased or under_scored, and a list of views as arguments. The controller name is retrieved as a pluralized version of the model name.

> To create a controller within a module, specify the model name as a path like 'parent_module/controller_name'.

> This generates a controller class in app/controllers and invokes helper, template engine and test framework generators.

To create your resource, you'd use the resource generator, and to create a migration, you can also see the migration generator (see, there's a pattern to all of this madness). These provide options to create the missing files to build a resource. Alternatively you can just run rails generate scaffold with the --skip option to skip any files which exist :)

I recommend spending some time looking at the options inside of the generators. They're something I don't feel are documented extremely well in books and such, but they're very handy.

Solution 2 - Ruby on-Rails

Great answer by Lee Jarvis, this is just the command e.g; we already have an existing model called User:

rails g scaffold_controller User

Solution 3 - Ruby on-Rails

For the ones starting a rails app with existing database there is a cool gem called schema_to_scaffold to generate a scaffold script. it outputs:

>rails g scaffold users fname:string lname:string bdate:date email:string encrypted_password:string

from your schema.rb our your renamed schema.rb. Check it

Solution 4 - Ruby on-Rails

In Rails 5, you can still run

$rails generate scaffold movie --skip

to create all the missing scaffold files or

rails generate scaffold_controller Movie

to create the controller and view only.

For a better explanation check out rails scaffold

Solution 5 - Ruby on-Rails

This command should do the trick:

$ rails g scaffold movie --skip

Solution 6 - Ruby on-Rails

You can make use of scaffold_controller and remember to pass the attributes of the model, or scaffold will be generated without the attributes.

rails g scaffold_controller User name email
# or
rails g scaffold_controller User name:string email:string

This command will generate following files:

create  app/controllers/users_controller.rb
invoke  haml
create    app/views/users
create    app/views/users/index.html.haml
create    app/views/users/edit.html.haml
create    app/views/users/show.html.haml
create    app/views/users/new.html.haml
create    app/views/users/_form.html.haml
invoke  test_unit
create    test/controllers/users_controller_test.rb
invoke  helper
create    app/helpers/users_helper.rb
invoke    test_unit
invoke  jbuilder
create    app/views/users/index.json.jbuilder
create    app/views/users/show.json.jbuilder

Solution 7 - Ruby on-Rails

I had this challenge when working on a Rails 6 API application in Ubuntu 20.04.

I had already existing models, and I needed to generate corresponding controllers for the models and also add their allowed attributes in the controller params.

Here's how I did it:

I used the rails generate scaffold_controller to get it done.

I simply ran the following commands:

rails generate scaffold_controller School name:string logo:json motto:text address:text

rails generate scaffold_controller Program name:string logo:json school:references

This generated the corresponding controllers for the models and also added their allowed attributes in the controller params, including the foreign key attributes.

create  app/controllers/schools_controller.rb
invoke  test_unit
create    test/controllers/schools_controller_test.rb

create  app/controllers/programs_controller.rb
invoke  test_unit
create    test/controllers/programs_controller_test.rb

That's all.

I hope this helps

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLanView Question on Stackoverflow
Solution 1 - Ruby on-RailsLee JarvisView Answer on Stackoverflow
Solution 2 - Ruby on-RailstokhiView Answer on Stackoverflow
Solution 3 - Ruby on-RailsfrenesimView Answer on Stackoverflow
Solution 4 - Ruby on-RailsNesha ZoricView Answer on Stackoverflow
Solution 5 - Ruby on-RailsAndrew HendrieView Answer on Stackoverflow
Solution 6 - Ruby on-RailsDeepak MahakaleView Answer on Stackoverflow
Solution 7 - Ruby on-RailsPromise PrestonView Answer on Stackoverflow