Веб-сервис, использующий Rails + MySql Best Practices - PullRequest
0 голосов
/ 14 апреля 2009

Хорошо, мне нужны советы и лучшие практики от некоторых людей из Rails.

Я довольно плохо знаком с платформой, но раньше я занимался веб-разработкой на основе базы данных на Java. На данный момент я проработал около двадцати учебных пособий, и мне постоянно мешают в одном и том же месте.

Вот что я сделал и что я испытываю. Я создал новое приложение, используя

rails my_rails_app

Я создал свою схему и таблицы в MySQL и создал учетную запись для rails (rails_root / pass1234) и обновил config / database.yml, чтобы отразить новую учетную запись:

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

На этом этапе я создаю каркас для таблицы «customer»:

ruby script/generate scaffold customer

Который успешно возвращается. Итак, теперь мы запускаем сервер:

ruby script/server

Который загружает Mongrel и запускает сервер, как и ожидалось, на порту 3000 на локальной машине. После направления браузера на http://localhost:3000/customers, на странице правильно написано «Список клиентов», но в нет полей, перечисленных . Когда я нажимаю ссылку для «нового клиента», все еще нет полей для изменения, но я могу создать пустую запись о клиенте. Так как эта операция помещает 'NULL' во все поля (некоторые из которых не могут иметь значение NULL), возникает ошибка Mysql - "имя столбца" не может быть NULL "с запросом SQL, который он пытался выполнить.

Я сбит с толку, главным образом, потому что, если он собирает мои поля в этот момент, почему он не отображает их раньше? Очевидно, он подключается к нужной базе данных и определил правильную таблицу. В чем дело?

Теперь, с другой стороны, если я помещаю записи в таблицу до запуска сервера, на странице теперь отображаются опции ссылок «Показать», «Редактировать» и «Уничтожить» под заголовком «Список клиентов». Однако поля или данные не отображаются. Если я нажму «Уничтожить», запись в таблице действительно будет уничтожена. Но я до сих пор не видел ни одной записи или поля на веб-странице, созданной 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 ]

1 голос
/ 14 апреля 2009

Я полагаю, что Rails добавит поля только для представлений, которые он создает в скаффолде, если вы укажете их во время создания скаффолда, то есть "script/generate scaffold post title:string body:text published:boolean" (это также создаст миграцию базы данных для рассматриваемой таблицы, Кстати). Я не думаю, что он выполняет какую-либо проверку базы данных во время строительных лесов, но я не копался в коде генерации строительных лесов, чтобы быть абсолютно уверенным.

0 голосов
/ 14 апреля 2009

Вы написали миграцию для модели контактов?

Rails читает поля непосредственно из базы данных и динамически генерирует атрибуты на основе того, что присутствует в таблице. Если вы просто запустите генератор скаффолдов, миграция все равно будет пустой. Как только миграция написана, вы можете запустить миграцию с помощью rake db:migrate, и тогда я считаю, что поля должны появиться в эшафот.

Однако прошло очень много времени с тех пор, как я прикасался к лесам. Они, IMHO, полезны только тогда, когда вы впервые изучаете Rails, и от их использования следует отказаться как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...