Yaay!  I'm happy to report success with my first attempt to make a Rails 
app that works from an existing database.  

This first experiment used (a) the simplest "instructions" I could find 
(basically, Hassan's); (b) a streamlined version of the "Getting Started 
Guide" process for setting up a Rails app (but - this is crucial - 
*omitting* the step of running the migrator); and (c) a pre-existing 
("legacy") database that conforms to the Rails naming conventions.

For the benefit of other Rails newbies (or oldbies) that need to build apps 
on existing DBs, a play-by-play of what I did follows.

1. Created new Rails app, *x*:
[sunward@web324 rails_eval]$ rails new x

2. Populated the "legacy" SQLite database with table toys, and added one 
row to that table: 
[sunward@web324 x]$ rails dbconsole
SQLite version 3.6.20
sqlite> CREATE TABLE toys ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"name" TEXT);
sqlite> INSERT INTO toys (name) VALUES ("Tinker");
sqlite> SELECT * FROM toys;
1|Tinker|58


3. Added the *toys *resource and root to *routes.rb*:      
Rails.application.routes.draw do
    resources :toys
    root 'toys#index'
end


4. Used *rake *to see the resulting routes:
[sunward@web324 x]$ rake routes
  Prefix Verb   URI Pattern              Controller#Action
    toys GET    /toys(.:format)          toys#index
         POST   /toys(.:format)          toys#create
 new_toy GET    /toys/new(.:format)      toys#new
edit_toy GET    /toys/:id/edit(.:format) toys#edit
     toy GET    /toys/:id(.:format)      toys#show
         PATCH  /toys/:id(.:format)      toys#update
         PUT    /toys/:id(.:format)      toys#update
         DELETE /toys/:id(.:format)      toys#destroy



5. Generated *toys *controller:
[sunward@web324 x]$ rails generate controller toys
      create  app/controllers/toys_controller.rb
      invoke  erb
      create    app/views/toys
      invoke  test_unit
      create    test/controllers/toys_controller_test.rb
      invoke  helper
      create    app/helpers/toys_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/toys.coffee
      invoke    scss
      create      app/assets/stylesheets/toys.scss



6. Added the necessary CRUD methods to the *toys *controller:
class ToysController < ApplicationController
    def index
        @toys = Toy.all
    end
    
    def show
        @toy = Toy.find(params[:id])
    end
     
    def new
        @toy = Toy.new
    end

    def create
        @toy = Toy.new(toy_params)
        if @toy.save
            redirect_to @toy
        else
            render 'new'
        end
    end 
    
    def edit
        @toy = Toy.find(params[:id])
    end

    def update
        @toy = Toy.find(params[:id])
        if @toy.update(toy_params)
            redirect_to @toy
        else
            render 'edit'
        end
    end



    def destroy
        @toy = Toy.find(params[:id])
        @toy.destroy

        redirect_to toys_path
    end    
    
    private
        def toy_params
            params.require(:toy).permit(:name)
        end    
end

7. Made* index.html.erb, show.html.erb, new.html.erb, edit.html.erb, 
_form.html.erb, index.json.jbuilder, show.json.jbuilder,* following the 
pattern in http://guides.rubyonrails.org/getting_started.html.

8. Created the *Toy *model file, toy.rb:
class Toy < ActiveRecord::Base
end 

9. In my browser, tried http://x.sunward.webfactional.com/toys.  Feel free 
to try it yourself.  (However, this is a temporary site that may be gone by 
the time you read this.)  *It works*!!!  That is, all the CRUDs execute as 
they should.

10. An odd note is that there still is no *schema.rb* file in *x/db/*.  If 
this is what Rails uses as its "database catalog", is the lack of it going 
to cause trouble down the road?

Thanks again to Scott, Hassan, & Colin for your key clues.

My next question is whether it is possible to sue the amazing Rails 
generators - in particular, scaffold - to more quickly create an app that 
works with an existing database - so it would not be necessary to go thru 
all those manual steps shown above.  I tried it once, and it tried to run 
the migrator and croaked when it found that the DB table was already 
there.  But that may have been pilot error on my part.  Comments and advice 
would be welcome.

~ Ken



-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/4a506cc5-5bf7-4f46-9628-b4dc6e7555b2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to