Rails tutorialをためす2

Setting the Application Home Page

ひな形を消す

% cd ~/project/blog
% rm public/index.html

config/routes.rbを編集して処理の振り分け先を変更します。
ひな形をちょっと変更します。

%  perl -pi -e 's/# root :to => "welcome#index"/root :to => "home#index"/g' config/routes.rb

ここは使い慣れたPerlで…

WEBrickが起動していない場合は次のようにserverを起動して、次のURLをリクエストした場合に指定したControllerへRoutingされている事を確認します。

% rails server 
% open -a 'Google Chrome' 'http://localhost:3000'

Creating a Resource

で、やっとRuby on Railsらしさが出てくる箇所です。

% rails generate scaffold Post name:string title:string content:text 
      invoke  active_record
      create    db/migrate/20110328132142_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/unit/post_test.rb
      create      test/fixtures/posts.yml
       route  resources :posts
      invoke  scaffold_controller
      create    app/controllers/posts_controller.rb
      invoke    erb
      create      app/views/posts
      create      app/views/posts/index.html.erb
      create      app/views/posts/edit.html.erb
      create      app/views/posts/show.html.erb
      create      app/views/posts/new.html.erb
      create      app/views/posts/_form.html.erb
      invoke    test_unit
      create      test/functional/posts_controller_test.rb
      invoke    helper
      create      app/helpers/posts_helper.rb
      invoke      test_unit
      create        test/unit/helpers/posts_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css

この状態で以下のようにリクエストを行います。

% open -a 'Google Chrome' 'http://localhost:3000/posts'

ただし、まだDB上にtableが存在しないので以下のようなメッセージが表示されます。

SQLite3::SQLException: no such table: posts: SELECT "posts".* FROM "posts"

Running a Migration

マイグレーションPerlでは存在しない概念だと思います。たぶん。
DBのschemaを差分管理しておき、元の状態に戻せるようにしている?

さきほどのrails generate scaffoldでmigration用のファイルも作成されています。

% cat db/migrate/*_create_posts.rb
class CreatePosts < ActiveRecord::Migration
  def self.up
    create_table :posts do |t|
      t.string :name
      t.string :title
      t.text :content

      t.timestamps
    end
  end

  def self.down
    drop_table :posts
  end
end

SQLのcreat文をrubyで記述しています。
なので次のようなrakeコマンドでDB上にtableが作成されます。

% rake db:migrate

DB上にテーブルが作成されたので確認

% open -a 'Google Chrome' 'http://localhost:3000/posts'

いわゆるListing画面が表示されているはずです。
といってもまだレコードが一個もないので何も表示されてませんが。

Adding a Link

TOPページからリンクを追加します。

%  echo '<%= link_to "My Blog", posts_path %>' >> app/views/home/index.html.erb

ということで実はすでにPost(投稿)の一覧表示、詳細表示、追加、編集、削除を行う事ができるようになりました。
RailsCRUD作成画面はある程度自動化して作成する事ができます。

http://localhost:3000/posts/new で新規作成画面が表示されますが、tableのcolumnがstringかtetかでinputかtextかを判断しています。

そういえば昔rails試したときにCRUD画面が自動的に作られているのに度肝を抜かれて同じ事ができるんじゃないかと思ってこんなものを作ってました。

http://coderepos.org/share/browser/lang/perl/SimpleCRUD/trunk/lib/SimpleCRUD.pm

なんというか青臭さがあふれ出ているソースコードです。

The Model

まだvalidationが存在しないのでこのロジックを追加します。

% vi app/models/post.rb
class Post < ActiveRecord::Base
  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
end

今日はここまで