掲示板を作る
色々知識が要りそうだから書きながら作る。
スキーマ
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時間かかってしまった。