特集のRuby on Rails入門をやりはじめた。

インストールしてあった、Instant Railsを使う。


環境マニアな私だが、勉強する時は環境に時間をかけないことにしている。
違う方向にずれてしまうから。(笑)デフォルト万歳。

開始

さっそく本に書いてあるとおりコンソールから

rails demo
cd demo
script/server

サーバーが起動しない。本と少し違うことしてしまった。
そういえば、Instant rails(windows)からはrubyコマンドを打ってからだった。
「焦るなよ」>自分へ

ruby script/server

よし、ブラウザからrailsの動作確認できた。
本の画面がやたら古い。0.13の時はテキストしかでてこないらしい。

次はDBの設定


予め、vimrubyの設定、rails.vimの設定は既にやってある。
印刷してあった二つのチートシートこれこれ)をクリアファイルに両面にして、
マウスと反対側に置いてはいおーけー。>ありがたく使用させて頂きます


vimで config/database.ymlを編集。

  • コメントは名前を見ればわかるから消しておいた
  • パスワード設定
  • 他はデフォルトでOK
development:
  adapter: mysql
  database: demo_development
  username: root
  password:
  host: localhost

test:
  adapter: mysql
  database: demo_test
  username: root
  password:
  host: localhost

production:
  adapter: mysql
  database: demo_production
  username: root
  password: 
  host: localhost

はてなスーパーpre記法(シンタックス・ハイライト)は、ほぼそのまんまvimのsyntaxハイライトの設定と同じだから楽だなぁ。

ここまでで大事そうなこと。

  • generateスクリプトは多用はする
  • 作ったらまずはDB設定をしろ(と歓迎メッセージに書いてある)
  • yamlvimで編集するとよい(これは私が勝手に・・・シンタックスはデフォルトで対応)
  • DBは何でもOKだが、お勧めはMySQLらしい。記事は古いが現時点でもそうだと思う。
  • 「クラスとモデルは1対1対応になる」

scaffoldをやるらしい

DB設定したら、いきなりscaffoldやるらしい。
いきなり美味しい部分を見せてもらえるわけですね。


では

ruby script/generate sccafold user


また、タイポった。


改めて

ruby script/generate scaffold user
C:\InstantRails\rails_apps\demo>ruby script/generate scaffold user
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/users
      exists  app/views/layouts/
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/user.rb
      create    test/unit/user_test.rb
      create    test/fixtures/users.yml
Unknown database 'demo_development'
  • MVCができたはず
  • userモデル
  • userコントローラー
  • userビュー

とりあえず、usersというテーブルがあったとしてという前提らしいです。
手順には書いてなかったので、省きました。


scaffoldはDBが見つからないと言ってくれました。

ソースの閲覧

rails.vimを使って、実際にできたソースを見てみる

:Rmodel user

おっ、config/database.ymlからapp/models/user.rbを開いてくれた。
こりゃ便利だ。>rails.vim

class User < ActiveRecord::Base
end

よし、続いてコントローラーも見てみるか。

:Rcontroller
app/controllers/users_controllerというファイルがありません


えー。開けない。ファイルがない?
FuzzyFinderで見てみる。>確かにない。


そういえば、railsセミナーで増井さんが言っていた気がする。「rails随所でデータベースのスキーマーを参照しにいっています」


なるほどDB接続(テーブルがなかった)できなかったから、scaffoldできなかったわけね。
じゃあ、usersテーブルとスキーマを作るよ。はい。

スキーマとテーブル作成

そういえば、WEB + DB PRESSの総集編に3x号までの記事PDFがあったな。
SQLを頂いてくるか。


うぉっ。このPDF参照がすごくしやすい。index.pdf開いてから10秒で(3クリックと数スクロール)で
目的のSQLが書いてあるページが表示できた。今度から勉強する時は、このPDFも必須だな。

▼リスト2 users テーブル
create table users (
id int unsigned not null auto_increment,
name varchar(20) not null,
password varchar(20) not null,
primary key (id)
);

実際は、migrarion使いたいところだけど。我慢。

vimでdatabase.ymlにもどり「demo_development」をコピペ。
phpmyadminスキーマーをつくり、引用のSQLを流した。

データベース環境完成。

動作検証

さて、もう一回scaffoldを流してみるか。

ruby script/generate scaffold user
      exists  app/controllers/
      exists  app/helpers/
      exists  app/views/users
      exists  app/views/layouts/
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/user.rb
   identical    test/unit/user_test.rb
   identical    test/fixtures/users.yml
      create  app/views/users/_form.rhtml
      create  app/views/users/list.rhtml
      create  app/views/users/show.rhtml
      create  app/views/users/new.rhtml
      create  app/views/users/edit.rhtml
      create  app/controllers/users_controller.rb
      create  test/functional/users_controller_test.rb
      create  app/helpers/users_helper.rb
      create  app/views/layouts/users.rhtml
      create  public/stylesheets/scaffold.css

うまくいったみたい。
こんどは、たくさんファイルが出力された。
テストケースもできるわけね。ふむふむ。


よし、rails.vimの威力をみせてくれ。
まずは、でmodelに戻っておく

modelを表示した状態で

:Rcontroller

そうすると、パラメータを指定しなくてもモデルに対応するコントローラーを開いてくれるはず。>rails.vim

class UsersController < ApplicationController
  def index
    list
    render :action => 'list'
  end

  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
         :redirect_to => { :action => :list }

  def list
    @user_pages, @users = paginate :users, :per_page => 10
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:notice] = 'User was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      flash[:notice] = 'User was successfully updated.'
      redirect_to :action => 'show', :id => @user
    else
      render :action => 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    redirect_to :action => 'list'
  end
end

キターっ。scaffoldで生成されたコードが表示された。が、、、それよりもrails.vimが思った通りに
動いてくれたほうがうれしい。(笑)


中でなにをやっているかは、今度やる増井さんのセミナーの復習の時にじっくり見るよ。(勉強会で実施する予定。複数人だとレビューもできる)


これもセミナー増井さんから言われたこと。「ジェネレーターはレベルが高い人が作っている事が多いので、生成されたコードは綺麗かつRuby&Railsらしい書き方がされている確率が高いので、とても参考になると思います。」


しかも、scaffoldは標準のジェネレーターだからなお更という感じでしょうか。


さて、Viewも見たいぞ!


たしかActionでview名をしている行で、gf(vimで感動したコマンドだ。)をやったら開けるんじゃなかったっけ??>rails.vim

<h1>Listing users</h1>

<table>
  <tr>
  <% for column in User.content_columns %>
    <th><%= column.human_name %></th>
  <% end %>
  </tr>
  
<% for user in @users %>
  <tr>
  <% for column in User.content_columns %>
    <td><%=h user.send(column.name) %></td>
  <% end %>
    <td><%= link_to 'Show', :action => 'show', :id => user %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => user %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => user }, :confirm => 'Are you sure?', :method => :post %></td>
  </tr>
<% end %>
</table>

<%= link_to 'Previous page', { :page => @user_pages.current.previous } if @user_pages.current.previous %>
<%= link_to 'Next page', { :page => @user_pages.current.next } if @user_pages.current.next %> 

<br />

<%= link_to 'New user', :action => 'new' %>

viewキター!!
やべぇこれ。


色んなところで、開発効率3倍とか言っている意味が、やってみたらわかった。


viewが表示されたところで、コントローラーに戻りたいので、はあえて使わず、これをやったらコントローラーを表示できるんじゃない??

:Rcontroller


できた…
vim使っていて良かったよ。今、心底そう思った。


NetbeansとかEclipseもいいが、やっぱvimだね。
Rails開発は基本的にvimにすることにして、RadRailsNetBeans(GUIIDEでのRails開発)の魅力を探る旅は控えめにしておくことにする。


まだまだrails.vimの機能は山盛りあるし、使ってみたい。


おっと、本の手順を進めないと。

サーバーを起動して、動作確認。
http://localhost:3000/users/

ruby script/server

scaffoldでcrudアプリができた。

最後だ

記事の最後では下記でまとめられている。

  • サーバー起動
  • モデル作成
    • ruby/generate model user
  • コントローラー作成
    • ruby/generate controller user

モデルジェネレーター実行結果

      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
   identical  app/models/user.rb
   identical  test/unit/user_test.rb
   identical  test/fixtures/users.yml
      create  db/migrate
      create  db/migrate/001_create_users.rb

なるほど、modelジェネレーターだとmigrateも生成されるんですね。
記事では特に触れられていなかったので、流します。

コントローラージェネレーター実行結果

      exists  app/controllers/
      exists  app/helpers/
      create  app/views/user
      exists  test/functional/
      create  app/controllers/user_controller.rb
      create  test/functional/user_controller_test.rb
      create  app/helpers/user_helper.rb

できた。


よし。


第一章完了

道をそれずにそのまんまできた。(rails.vimではあぶなかったけど。)

  • 第一章の振り返り(KPT法使うよ)とまとめ。

ぷちKPT

  • KEEP【良かった事、続けていきたい事】
    • 全く同じようにするのも大事だ。勉強の道からはずれない。
    • rails.vimを利用できた
    • 勉強できる環境と、意気込みを整えられた
    • 実際に入力して体に叩き込めた
    • はてなDiaryを書きながら実行できた
  • PROBLEM【悪かったこと、改善したい事】
    • 焦るな
    • タイポ気をつけろ
    • 本をよく読め
  • TRY【今後取り込みたいこと】
    • そこそこな時間集中して取り組むので飲み物やおやつを側におきたい
    • rails.vimの機能をもっと使いたい(常にrails.vimで楽できないかを意識する)
    • ジェネレーターを多用したい
    • ソースコードの中を解析したい
    • やっている最中の事を文章に書き出すと自分の考えていることや反省点がわかったので続けていきたい。(見える化)

まとめ

  • 基本コマンドは簡単に実行できる
  • Railsアプリ作るときは、DBも合わせて必ず作ろう
  • モデル、コントローラー、ビューは決まった位置に配置される(規約重要)
  • モデルの親クラスは、「ActiveRecord::Base」クラス
  • コントローラーの親クラスは、「ApplicationController」クラス
  • データベースは設定は、config/database.yml

お礼とお願い

最後まで、読んで下さった方ありがとうございました。
コメントに「良かった点・悪かった点・疑問点」などあれば、1言でも何でも構いませんのでご意見いただけたらうれしいです。
KPTに活かしたいです。