Posts Tagged ‘Padrino’

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ライクなディレクトリ構成とコード自動生成が出来ます。 また、テストフレームワーク、ビュー、モデルなどが疎結合になっており、自由に選択できるところも魅力だと感じました。