使用Rails + MySql最佳实践的Web服务

时间:2009-04-14 16:34:53

标签: mysql ruby-on-rails service

好吧,我需要一些Rails人员的建议和最佳实践。

我对这个平台还不熟悉,但我之前在Java中完成了数据库支持的Web开发工作。在这一点上,我已经完成了大约二十个教程,并且我一直在同一个地方受阻。

这就是我所做的和我正在经历的事情。我使用

创建了一个新的应用程序
rails my_rails_app

我在MySQL中创建了我的架构和表格,并且我已经为rails创建了一个帐户(rails_root / pass1234)并更新了config / databases.yml以反映新帐户:

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

此时,我为'customers'表生成了脚手架:

ruby script/generate scaffold customer

成功返回。所以现在我们启动服务器:

ruby script/server

启动Mongrel并在本地计算机的端口3000上按预期启动服务器。将浏览器定向到http://localhost:3000/customers后,页面会正确显示“列出客户”,但没有列出字段。当我按下“新客户”的链接时,仍然没有要修改的字段,但我可以创建一个空的客户记录。由于此操作在所有字段(其中一些不可为空)中放置'nulls',因此抛出了Mysql错误 - 使用它尝试运行的SQL查询,“column'name'不能为null”。

我很困惑主要是因为如果它在那时拾取我的字段,为什么它不提前显示它们?显然,它连接到正确的数据库,并确定了正确的表。这是什么交易?

另一方面,如果我在启动服务器之前将条目放入表中,页面现在会在“列出客户”标题下方显示“显示”,“编辑”和“销毁”链接选项。但是,没有反映任何字段或数据。如果我单击“Destroy”,表中的记录确实被破坏了。但我仍然没有看到rails生成的网页上的任何记录或字段,除非它是一条错误消息。

这是我的生成脚手架命令的输出:

\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

以下是生成的主要文件:

应用\控制器\ 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

应用\视图\触点\ 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 %>

应用\视图\触点\ show.html.erb

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

应用\视图\触点\ 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 %>

应用\视图\触点\ 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 %>

非常感谢任何(进一步)建议!

2 个答案:

答案 0 :(得分:1)

我相信如果你在创建脚手架时指定它们,Rails只会为它在脚手架中创建的视图添加字段,即“script/generate scaffold post title:string body:text published:boolean”(这也将为表创建数据库迁移)问题,顺便说一下)。我不认为它在脚手架期间对数据库进行任何检查,但我还没有深入研究脚手架生成代码。

答案 1 :(得分:0)

您是否为联系人模型编写了迁移?

Rails直接从数据库中读取字段,并根据表中的内容动态生成属性。如果您只运行脚手架生成器,则迁移仍为空。编写迁移后,您可以使用rake db:migrate运行迁移,然后我相信字段应显示在支架中。

然而,自从我触及脚手架以来,已经很长时间了。他们是恕我直言,只有在你第一次学习Rails时才有用,并且应尽早放弃使用它们。