Posts Tagged ‘Rails’

Rails + Sinatra ≒ Padrino で遊ぼう!

6月 13th, 2010

Rails3の登場が待ち遠しい中、社内プロジェクトをSinatraで進めていました。 しかし、Sinatraの軽量感はいいのですが、少し大きなプロジェクトになると、app.rbが煩雑になります。 そこで、Railsみたいなディレクトリ分けをして作っていきますが、その時やはりRailsみたいにコードの自動生成が欲しくなってきます。

Padrinoを使いましょう!

軽量フレームワークSinatraを使い、Railsみたいな自動コード生成が出来ます。 http://www.padrinorb.com/

他に、Padrinoには下記のような機能が付いています。 Padrino公式サイト

  1. 複数の有名なテストフレームワークとの連携
  2. 複数の有名なテンプレートエンジンとの連携
  3. データベースも複数対応
  4. コードジェネレータ(モデル・コントローラの自動生成)
  5. 複数のアプリケーションを簡単に統合させるマウント機能
  6. 強力なルーティング機能
  7. 各種ヘルパー機能(タグ、アセット、フォーム、テキスト)
  8. メーラー機能
  9. 管理画面自動生成
  10. ログ収集機能
  11. リローディング機能
  12. 国際化

Blog作成チュートリアル

下記スクリーンキャストは、作者本人による説明です。

下記内容は、公式チュートリアルに掲載していあるBlogの作成を行いました。

Padrinoフレームワークのインストール

いつもどおり、gemで一発終了です。

gem install padrino
sample_blogプロジェクトの初期化

Railsプロジェクトと同様ですが、プロジェクトで使用するディレクトリ構成、及び、設定ファイル等を自動的に作成をしてくれます。 下記内容では、テストにshoulda、ビューにhaml、sass、ORMにactiverecordを使用するという設定です。

padrino-gen project sample_blog -t shoulda -e haml -c sass -s jquery -d activerecord -b
cd sample_blog
Routeの初期設定

既に自動生成されている下記ファイルを書き換え、テストも兼ねて「Hello World!」を入れてみましょう。

app/app.rb

class SampleBlog < Padrino::Application
  configure do
     # ...
  end
 
  # Add these routes below to the app file...
  get "/" do
    "Hello World!"
  end
 
  get :about, :map => '/about_us' do
    render :haml, "%p This is a sample blog created to demonstrate the power of Padrino!"
  end
end
動作確認

padrinoを起動させて、WEBアプリケーションが出来ているか確認しましょう。

padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/
# http://localhost:3000/about_us
管理画面作成

次に管理画面を自動生成してみましょう! これも、自動生成が付いているので手軽に管理画面が構築出来ます。

padrino-gen admin
padrino rake ar:create
padrino rake ar:migrate

下記コマンドで、管理画面へログインする初期アカウント作成を行います。

padrino rake seed
# 任意のEメールとパスワードを入力
動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/admin/
モデル作成

Rails同様に、モデルも自動生成出来ます。

padrino-gen model post title:string body:text

下記自動生成された、マイグレートファイルに「t.timestamps」を追加します。

db/migrate/002_create_posts.rb

class CreatePosts &lt; ActiveRecord::Migration
  def self.up
    create_table :posts do |t|
      t.string :title
      t.text :body
      t.timestamps
    end
  end
 
  def self.down
    drop_table :posts
  end
end
マイグレート

アクティブレコードでのマイグレーションを実行します。 DBはデフォルトで、sqlite3なので、プロジェクト直下のdbディレクトリ内に「development.db」が生成されます。 ※sqlite3のファイル内容を確かめるには、TkSQLiteがお勧めです! http://reddog.s35.xrea.com/wiki/TkSQLite.html

padrino rake ar:migrate
コントローラ自動生成

下記コマンドでコントローラを自動生成します。 URIの規則は、Railsと同様になっています。

padrino-gen controller posts get:index get:show

自動生成されたpost.rbを下記のように書き換えます。 indexは、Postモデルからデータを取得して@postsに入れてViewに渡しています。 showは、URIからidを取得して、Postモデルから検索し、@postに入れてViewに渡しています。

app/controllers/posts.rb

SampleBlog.controllers :posts do
  get :index do
    @posts = Post.all(:order =&gt; 'created_at desc')
    render 'posts/index'
  end
 
  get :show, :with =&gt; :id do
    @post = Post.find_by_id(params[:id])
    render 'posts/show'
  end
end
ビュー作成

Hamlでビューを書いています。

app/views/posts/index.haml

- @title = "Welcome"
 
#posts= partial 'posts/post', :collection =&gt; @posts

app/views/posts/_post.haml

.post
  .title= link_to post.title, url_for(:posts, :show, :id =&gt; post)
  .date= time_ago_in_words(post.created_at || Time.now) + ' ago'
  .body= simple_format(post.body)

app/views/posts/show.haml

- @title = @post.title
#show
  .post
    .title= @post.title
    .date= time_ago_in_words(@post.created_at || Time.now) + ' ago'
    .body= simple_format(@post.body)
%p= link_to 'View all posts', url_for(:posts, :index)
管理画面にpostモデルを追加する

下記魔法のコマンドで、先程生成した管理画面にpostモデルを追加できます。

padrino-gen admin_page post
動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/admin/
モデルへ新カラム追加

下記コマンドで、postモデルに、acount_idカラムを追加しています。

padrino-gen migration AddAccountToPost account_id:integer

postモデルにバリデーションルールとacountとの関連ルールを追加

app/models/post.rb

class Post &lt; ActiveRecord::Base
  belongs_to :account
  validates_presence_of :title
  validates_presence_of :body
end

管理画面でのpostモデル新規作成時に、accountが管理画面へログインしているユーザになるようにする (「@post.account = current_account」の一行)

admin/controllers/posts.rb

Admin.controllers :posts do
# ...
  post :create do
    @post = Post.new(params[:post])
    @post.account = current_account
    if @post.save
      flash[:notice] = 'Post was successfully created.'
      redirect url(:posts, :edit, :id =&gt; @post.id)
    else
      render 'posts/new'
    end
  end
# ...
end
ビューに「Posted by」を追加

アクティブレコードのお陰で、コントローラをいじらずすんなり追加できます。

app/views/posts/show.haml

- @title = @post.title
#show
  .post
    .title= @post.title
    .date= time_ago_in_words(@post.created_at || Time.now) + ' ago'
    .body= simple_format(@post.body)
    .details
      .author Posted by #{@post.account.email}
%p= link_to 'View all posts', url_for(:posts, :index)

app/views/posts/_post.haml

.post
  .title= link_to post.title, url_for(:posts, :show, :id =&gt; post)
  .date= time_ago_in_words(post.created_at || Time.now) + ' ago'
  .body= simple_format(post.body)
  .details
    .author Posted by #{post.account.email}
CSSの配置

下記パスより、CSSを2つ取得する。 http://github.com/padrino/sample_blog/tree/master/public/stylesheets/ 配置場所:\sample_blog\public\stylesheets

動作確認
padrino start
# ブラウザで下記URLをアクセス
# http://localhost:3000/posts
感想

sinatraの手軽さを残しつつ、Railsライクなディレクトリ構成とコード自動生成が出来ます。 また、テストフレームワーク、ビュー、モデルなどが疎結合になっており、自由に選択できるところも魅力だと感じました。

Rails ActiveRecordのテストコード

7月 26th, 2009

ActiveRecordって

WEBアプリケーションを高速開発するのに貢献した、Ruby On Railsを書いた人がどのようなコードを書いたのか勉強したいと思った。

ActiveRecordのコードを全体像を見てみました。 ActiveRecord自体の説明は下記参照

ActiveRecord (以下 AR) は RLR 第 4 回 に取り上げられたように、Ruby での O/R マッピングライブラリのひとつです。 AR を使えば、簡単かつ効率的にリレーショナルデータベース上の情報を Ruby オブジェクトとして扱うことができます。その理論的なところは P of EAA: Active Record を見てください。 参照:RubyOnRails を使ってみる 【第 3 回】 ActiveRecord

コードステップを計る

まずは、コードステップ数。 Project AmaterasのNetBeans対応ステップカウンターに感謝します! 私は、NetBeansを使っていますが、Eclipseにも対応してますよ。

CAP000012

Netbeans内で、実装コード、空行、コメント行がフォルダ単位で調べられます。

activerecord-2.3.2 実装コード

  • 57ファイル、実効コード9.9KStep、コメント7.2KStep
  • 1ファイルあたり、実効コード173Step、コメント126Step

テストコード

  • 188ファイル、実効コード19.7KStep、コメント0.5KStep
  • 1ファイルあたり、実効コード104Step、コメント3Step

驚いたことに、実装コードとほぼ同じぐらいコメントを書いている。 コード1行に対してコメント1行ってすごいね。 これは、Rdoc 使ってドキュメントも作っているからこれぐらいの行数になるんですね。

更に、びっくりしたのは、テストコード!。 これ、実装コードに対してテストコードを2倍書いています。 しかも、テストコードのファイル数は3倍以上で作っています。 少ない行数で沢山のテストコードを細かく実装しているんですね。 テストコードにコメントは作っていませんね。 テストコード自体を文章で説明しなければいけないテストコードは書くなということでしょう。 簡潔に誰が見てもどのようなテストを実施しているのかわかるテストコードを書いています。 また、書く必要があるときは、実装コードの中に集約しているのでしょう。そうすれば、RDocの中に仕様を集約できるからね。

定量的に品質を考える重要性

最近僕もあるプロジェクトをTDDで開発しています。 上記、ActiveRecordのテストコード作成と実装コードの比率は参考になりました。 テストファーストの考え方とか、実装するコードのステップ数とか、何を何のために作っているかを意識しながらプロジェクトを進めていくことは大事だと思います。 改めて、品質を考える上でも定量的にコーディングをとらえることは重要だと思いました。