掲示板を作る

色々知識が要りそうだから書きながら作る。

スキーマ

create table messages (
    id int not null auto_increment primary key,
    name varchar(100) not null,
    body text not null,
    created_at datetime not null
);

'created_at' とか 'updated_on' とかの名前にするとよしなにしてくれるらしい。

コントローラー作る

BbsController の index で一覧、show で個別のレス、post で投稿ってことにする。

> script/generate controller Bbs index show post

URLのマッピング

'/' で Bbs#index、'/12' とかで Bbs#show になるように config/routes.rb をかく。

ActionController::Routing::Routes.draw do |map|
  map.connect '',
              :controller => 'bbs'
  map.connect ':id',
              :id => /\d+/,
              :controller => 'bbs',
              :action => 'show'
  map.connect ':action',
              :controller => 'bbs'
end

うーん、冗長な気がする。

コントローラー中身

class BbsController < ApplicationController
  def index
    @message_pages, @messages = paginate :messages, :order => 'created_at desc'
  end

  def show
    @message = Message.find(params[:id])
  end

  def post
    @message = Message.new(params[:message])
    unless @message.save
      flash[:notice] = 'なんかしっぱい'
    end
    redirect_to :action => 'index'
  end
end

ページャを自動でやってくれたりしてらくちん。

ビュー

適当に。リスト表示の部分だけ載せる。
app/views/bbs/index.rhtml

...
<%= pagination_links(@message_pages) %>
<div class="messages">
  <%= render :partial => 'message', :collection => @messages %>
</div>
...

app/views/bbs/_message.rhtml

<div class="message">
  <%= simple_format(h(message.body)) %>
  <p class="footter">
    <%= h(message.name) %> |
    <%= link_to message.created_at.strftime('%Y/%m/%d %H:%M:%S'), :action => 'show', :id => message %>
  </p>
</div>

<%= render :partial ... %> って時は普通に親の変数が使えるようになってればいいのに、よくわからない仕様。

できた。2時間かかってしまった。