2009-04-14 8 views
0

In Ordnung, ich brauche einige Ratschläge und Best Practices von einigen Rails Menschen.Web-Service mit Rails + MySql Best Practices

Ich bin ziemlich neu auf der Plattform, aber ich habe Datenbank-basierte Web-Entwicklungsarbeit zuvor in Java getan. An diesem Punkt habe ich ungefähr zwanzig Tutorials durchgearbeitet, und ich werde immer wieder am selben Ort behindert.

Hier ist, was ich getan habe und was ich erlebe. Ich habe eine neue Anwendung

rails my_rails_app 
mit erstellt

Ich habe mein Schema und Tabellen in MySQL erstellt, und ich habe ein Konto für Schienen (RAILS_ROOT/pass1234) und aktualisierte config/databases.yml erstellt die widerzuspiegeln neues Konto:

development: 
    adapter: mysql 
    encoding: utf8 
    reconnect: false 
    database: demo_development 
    username: rails_root 
    password: pass1234 
    host: localhost 

An dieser Stelle erzeugen ich das Gerüst für die Tabelle ‚Kunden‘:

ruby script/generate scaffold customer 

die erfolgreich zurückgibt. So, jetzt starten wir den Server:

ruby script/server 

Welche Mischlings bootet und startet den Server bis zum Port 3000 auf dem lokalen Rechner zu erwarten. Nachdem der Browser auf http://localhost:3000/customers gerichtet wurde, wird auf der Seite korrekt "Kunden auflisten" angezeigt, aber enthält keine Felder. Wenn ich den Link für "Neukunde" drücke, gibt es noch keine Felder zu ändern, aber ich darf einen leeren Kundendatensatz erstellen. Da diese Operation Nullen in allen Feldern platziert (von denen einige nicht nullbar sind), wird ein Mysql-Fehler ausgelöst - "Spaltenname kann nicht null sein" mit der SQL-Abfrage, die versucht wurde auszuführen.

Ich bin hauptsächlich verwirrt, weil, wenn es meine Felder an diesem Punkt abholt, warum zeigt es sie früher nicht an? Offensichtlich verbindet es sich mit der richtigen Datenbank und hat die richtige Tabelle identifiziert. Was ist das Problem?

Nun, auf der anderen Seite, wenn ich Einträge in die Tabelle vor dem Starten des Servers platzieren, zeigt die Seite jetzt "Show", "Edit" und "Destroy" Link-Optionen unter dem "Listing customers" Header. Es werden jedoch keine Felder oder Daten wiedergegeben. Wenn ich auf "Zerstören" klicke, wird der Datensatz in der Tabelle tatsächlich zerstört. Aber ich habe immer noch keine der Datensätze oder Felder auf einer von Rails generierten Webseite gesehen, es sei denn, es handelt sich um eine Fehlermeldung.

Dies war die Ausgabe von meinem erzeugen Gerüst Befehl:

\ROR\my_app>ruby script/generate scaffold contact 
     exists app/models/ 
     exists app/controllers/ 
     exists app/helpers/ 
     create app/views/contacts 
     exists app/views/layouts/ 
     exists test/functional/ 
     exists test/unit/ 
     create test/unit/helpers/ 
     exists public/stylesheets/ 
     create app/views/contacts/index.html.erb 
     create app/views/contacts/show.html.erb 
     create app/views/contacts/new.html.erb 
     create app/views/contacts/edit.html.erb 
     create app/views/layouts/contacts.html.erb 
     create public/stylesheets/scaffold.css 
     create app/controllers/contacts_controller.rb 
     create test/functional/contacts_controller_test.rb 
     create app/helpers/contacts_helper.rb 
     create test/unit/helpers/contacts_helper_test.rb 
     route map.resources :contacts 
    dependency model 
     exists app/models/ 
     exists test/unit/ 
     exists test/fixtures/ 
     create app/models/contact.rb 
     create test/unit/contact_test.rb 
     create test/fixtures/contacts.yml 
     create db/migrate 
     create db/migrate/20090414185634_create_contacts.rb 

Und hier sind die wichtigsten Dateien generiert:

app \ Controller \ contacts_controller.rb

class ContactsController < ApplicationController 
    # GET /contacts 
    # GET /contacts.xml 
    def index 
    @contacts = Contact.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @contacts } 
    end 
    end 

    # GET /contacts/1 
    # GET /contacts/1.xml 
    def show 
    @contact = Contact.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @contact } 
    end 
    end 

    # GET /contacts/new 
    # GET /contacts/new.xml 
    def new 
    @contact = Contact.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @contact } 
    end 
    end 

    # GET /contacts/1/edit 
    def edit 
    @contact = Contact.find(params[:id]) 
    end 

    # POST /contacts 
    # POST /contacts.xml 
    def create 
    @contact = Contact.new(params[:contact]) 

    respond_to do |format| 
     if @contact.save 
     flash[:notice] = 'Contact was successfully created.' 
     format.html { redirect_to(@contact) } 
     format.xml { render :xml => @contact, :status => :created, :location => @contact } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @contact.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /contacts/1 
    # PUT /contacts/1.xml 
    def update 
    @contact = Contact.find(params[:id]) 

    respond_to do |format| 
     if @contact.update_attributes(params[:contact]) 
     flash[:notice] = 'Contact was successfully updated.' 
     format.html { redirect_to(@contact) } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @contact.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /contacts/1 
    # DELETE /contacts/1.xml 
    def destroy 
    @contact = Contact.find(params[:id]) 
    @contact.destroy 

    respond_to do |format| 
     format.html { redirect_to(contacts_url) } 
     format.xml { head :ok } 
    end 
    end 
end 

app \ Ansichten \ contacts \ index.html.erb

<h1>Listing contacts</h1> 

<table> 
    <tr> 
    </tr> 

<% @contacts.each do |contact| %> 
    <tr> 
    <td><%= link_to 'Show', contact %></td> 
    <td><%= link_to 'Edit', edit_contact_path(contact) %></td> 
    <td><%= link_to 'Destroy', contact, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 
</table> 

<br /> 

<%= link_to 'New contact', new_contact_path %> 

app \ Ansichten \ Kontakte \ show.html.erb

<%= link_to 'Edit', edit_contact_path(@contact) %> | 
<%= link_to 'Back', contacts_path %> 

app \ Ansichten \ Kontakte \ new.html.erb

<h1>New contact</h1> 

<% form_for(@contact) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', contacts_path %> 

app \ Ansichten \ Kontakte \ edit.html.erb

<h1>Editing contact</h1> 

<% form_for(@contact) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.submit 'Update' %> 
    </p> 
<% end %> 

<%= link_to 'Show', @contact %> | 
<%= link_to 'Back', contacts_path %> 

Jede (weitere) Beratung wäre sehr willkommen!

+0

Es hört sich an, als ob Ihr Gerüst nicht ordnungsgemäß erzeugt wurde. Können Sie den erstellten Code posten? –

+0

Absolut. Ich habe die von ihr generierte Quelle gepostet. Es sieht so aus als ob "show.html.erb" nicht viel macht! Danke, und lassen Sie mich bitte wissen, wenn etwas auf Sie springt. –

Antwort

1

Ich glaube, dass Rails nur Felder für die Sichten hinzufügen wird, die in einem Gerüst erstellt werden, wenn Sie sie zum Zeitpunkt der Erstellung des Gerüsts angeben, zB "script/generate scaffold post title:string body:text published:boolean" (dies erzeugt auch eine Datenbankmigration für die fragliche Tabelle der Weg). Ich denke nicht, dass es während des Scaffoldings eine Überprüfung der Datenbank durchführt, aber ich habe mich nicht in den Gerüstgenerierungscode gegraben, um absolut sicher zu sein.

0

Haben Sie eine Migration für das Kontaktmodell geschrieben?

Rails liest Felder direkt aus der Datenbank und generiert dynamisch die Attribute basierend auf dem, was in der Tabelle vorhanden ist. Wenn Sie nur den Gerüstgenerator ausführen, ist die Migration noch leer. Sobald die Migration geschrieben ist, können Sie die Migrationen mit rake db:migrate ausführen und dann glaube ich, dass die Felder im Gerüst angezeigt werden sollten.

Es ist jedoch sehr lange her, dass ich Gerüste berührt habe. Sie sind, IMHO, nur nützlich, wenn Sie zum ersten Mal Rails lernen, und ihre Verwendung sollte zum frühestmöglichen Zeitpunkt aufgegeben werden.