RailsOffice / 081014


RailsOffice

RubyOnRails?勉強会

参考

RubyOnRails2.0チュートリアル

日本語設定

テーブルの作成しよう

  • 注:参考にしたデータベースはMySQL
    • シバのデータベースはSQLite3なので、注意が必要。
  • MySQLでは
    • 以前のヴァージョンでは
      sqlファイルを作成し、データベースを直接操作する。
      [create.sql]
      drop table if exists articles;
      create table articles (
       id         int         not null   auto_increment,
       title        varchar(100)   not null,
       description   text        null,
       image_url    varchar(200)   not null,
       price       decimal(10,2)   not null,
       date       datetime      not null,
       vender     varchar(100)   not null,
       category    varchar(100)   not null,
       primary key (id)
      );
    • このヴァージョン(Rails2.0)では
      「scaffold」を使ってテーブルを作成できる
      ruby script/generate scaffold article title:string description:text image_url:string price:decimal date:datetime vender:string category:string
      実行例-rubyonrails-createtable?
  • SQLite3では
    データベース作成時に、テーブル作成を要求される。
    前回のページを参考にしましょう
    RubyOnRails/081008?
    しかし、
    ruby script/generate scaffold article title:string description:text image_url:string price:decimal date:datetime vender:string category:string
    がそのまま使えるかも

「db/migrate」をみてみよう

%cd db/migrate/
%ls
>001_create_articles.rb

001_create_articles.rb?
データベースにこのテーブルを適用する場合には、このupメソッドを使います。 目的のテーブルを定義するコードはこの部分に記述します。
今回は、scaffoldを利用してフィールドをある程度定義しましたので、すでにupメソッドにはフィールドが追加されています。
ただ、priceフィールドの型「decimal」を10桁、小数点第2位の数字に定義したいので、「001_create_articles.rb」ファイルを以下のように修正します。
001_create_articles.rb#modefied?
このように、「t.decimal : price, : precision => 10, : scale => 2, : default =>0」とすると、「decimal」を10桁、小数点第2位の数字でかつ、デフォルトの値を「0」で定義できます。


このデータベースを適用してみよう

  • 「rake db:migrate」と入力
    %rake db:migrate
    >(in /home/ono/rails_study/office)
    == 1 CreateArticles: migrating ================================================
    -- create_table(:articles)
       -> 0.0044s
    == 1 CreateArticles: migrated (0.0047s) =======================================
    これでいいっぽい。

テーブルができているか確認しよう

MySQL

*1

  • MySQLにはいる
  • データベースを指定する
  • 「show tables;」
  • 「describe articles;」

SQLite3

*2

%sqlite3 office_development.db
sqlite> .schema
CREATE TABLE articles(
id INTEGER not null PRIMARY KEY AUTOINCREMENT,
title  varchar(100) not null,
description text null,
image_url varchar(200) not null,
price  decimal(10,2) not null,
date datetime not null,
vender varchar(100) not null,
category varchar(100) not null);

WEBrick

%ruby script/server

実行例? このままだと、ポート番号3000で起動する。
先生が3000で使っていたからか、変になった。

%ruby script/server -p 5666

で実行する。

=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:5666
=> Ctrl-C to shutdown server; call with --help for options

ブラウザから見てみよう

http://localhost:5666/articles/

例:

#ref(): File not found: "RubyOnRails-ex01.png" at page "RailsOffice/081014"

フィールドの追加と削除するにはどうしよう

削除しよう

  • 試しに「date」フィールドの削除をしてみましょう。
  1. WEBrickが動いている場合は一度止めておいた方がよいでしょう(Ctrキー+C)。
  2. まずは、ジェネレータを実行します。
    1. 操作は新しく作成したときと同じです。
    2. ruby script/generate scaffold article title:string description:text image_url:string price:decimal vender:string category:string
    3. 変更点:「date:datetime」が無いこと
exists  app/models/
     exists  app/controllers/
     exists  app/helpers/
     exists  app/views/articles
     exists  app/views/layouts/
     exists  test/functional/
     exists  test/unit/
overwrite app/views/articles/index.html.erb? (enter "h" for help) [Ynaqdh]
  • 「a」とうつ。
    forcing scaffold
          force  app/views/articles/index.html.erb
          force  app/views/articles/show.html.erb
          force  app/views/articles/new.html.erb
          force  app/views/articles/edit.html.erb
      identical  app/views/layouts/articles.html.erb
      identical  public/stylesheets/scaffold.css
     dependency  model
         exists    app/models/
         exists    test/unit/
         exists    test/fixtures/
      identical    app/models/article.rb
      identical    test/unit/article_test.rb
           skip    test/fixtures/articles.yml
         exists    db/migrate
    Another migration is already named create_articles: db/migrate/001_create_articles.rb
  • 「ruby script/generate migration remove_date」と実行。
       exists  db/migrate
       create  db/migrate/002_remove_date.rb
  • 「db/migrate/002_remove_date.rb」の編集
    RubyOnRails_002_remove_date?
  • 「rake db:migrate」を実行します。
    %rake db:migrate
    (in /home/ono/rails_study/office)
    == 2 RemoveDate: migrating ====================================================
    -- remove_column(:articles, :date)
      -> 0.0257s
    == 2 RemoveDate: migrated (0.0261s) ===========================================
  • 確認
    sqlite> .schema articles
    CREATE TABLE articles(
    id INTEGER not null PRIMARY KEY AUTOINCREMENT,
    title  varchar(100) not null,
    description text null,
    image_url varchar(200) not null,
    price  decimal(10,2) not  null,
    date datetime not null,
    vender varchar(100) not null,
    category varchar(100) not null);
    消えてなかった・・・・
    ウェブページにて確認すると。。
    消えていた

    #ref(): File not found: "RubyOnRails-Articles-remove.png" at page "RailsOffice/081014"

追加しよう

  1. 一度WEBrickを止める
  2. 「ruby script/generate scaffold article title:string description:text image_url:string price:decimal date:datetime vender:string category:string」を打つ
  3. 途中で「app/views/articles/index.html.erb」ファイルを上書きするかどうか聞いてくるので、「a」とにゅうりょくする。
  4. 「ruby script/generate migration add_date」を入力する。
  5. さっき作った「db/migrate/003_add_date.rb」のファイルを編集する
    1. class AddDate < ActiveRecord::Migration
       def self.up
         add_column :articles, :date, :datetime
       end
       def self.down
         remove_column :articles, :date
       end
      end
  6. 次に、「rake db:migrate」を実行します。
  7. articlesテーブルを確認してみましょう
  8. WEBrickを起動して、ブラウザを確認してみましょう。
    1. ruby script/server -p 5666

*1 officeフォルダで行う
*2 db フォルダ