掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その1【何を作るの?】
掲示板を作ってみる・その2【モデルを作る パート1】
掲示板を作ってみる・その3【モデルを作る パート2】
掲示板を作ってみる・その4【ルーティングを考える】
掲示板を作ってみる・その5【コントローラを生成】
掲示板を作ってみる・その6【ヘルパを作る】
掲示板を作ってみる・その7【スレッド用コントローラを編集】
掲示板を作ってみる・その8【レス用コントローラを編集】
掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】
掲示板を作ってみる・その10【スレッド用のビューファイルを作成】
掲示板を作ってみる・その11【レス用のビューファイルを作成】
掲示板を作ってみる・その12【ruby-gettext で日本語化】
レス用コントローラを編集するまえに、定数定義をしておきます。それは1スレッドに、レスは最大いくつ書き込めるか、です。
config/environment.rb のファイルの本当に一番最後の行に
MAX_POSTS = 1000
と書きます。
それでは、レス用コントローラを編集しましょう。list メソッドがかなり長く、読み解くには相当な忍耐力がいりそうです。
app/controllers/post_controller.rb
class PostController < ApplicationController
def list
post_range = PostHelper::PostRange.new(params[:range])
@topic = Topic.find(params[:topic_id])
total_post = @topic.posts.count
sql_arr = []
sql = '(1 = 1'
unless post_range.first.blank?
unless post_range.from_last?
sql += ' AND res_no >= ?'
sql_arr << post_range.first
end
end
unless post_range.last.blank?
unless post_range.from_last?
sql += ' AND res_no <= ?'
sql_arr << post_range.last
else
sql += ' AND res_no >= ? - ? + 1'
sql_arr << total_post << post_range.last
end
end
if post_range.include_first?
sql += ' OR res_no = 1'
end
sql += ')'
sql_arr.unshift sql
res_no_min = @topic.posts.minimum('res_no', :conditions => sql_arr)
res_no_max = @topic.posts.maximum('res_no', :conditions => sql_arr)
if res_no_min.blank?
@res_no_prev = 1
elsif res_no_min - 1 < 1
@res_no_prev = 1
else
@res_no_prev = res_no_min - 1
end
if res_no_max.blank?
@res_no_next = 1
else
@res_no_next = res_no_max + 1
end
@posts = @topic.posts.find(:all, :conditions => sql_arr)
@topic_max_res_no = @topic.posts.maximum('res_no')
@html_title = @topic.title
end
def confirm
@post = Post.new(params[:post])
@html_title = 'レス作成確認'
end
def create
@post = Post.new(params[:post])
@topic = Topic.find(params[:post][:topic_id])
Post.transaction do
@topic.age_time = Time.now unless @post.email == 'sage'
@topic.save!
@post.res_no = Post.my_topic(params[:post][:topic_id]).maximum(:res_no) + 1
@post.ip_address = request.remote_ip
@post.save!
end
redirect_to :action => 'list', :id => @topic.id
rescue
@html_title = 'ERROR'
render :action => 'confirm'
end
end
・list メソッド
どうしても SQL を 1 から組み立てる形式になってしまいました。ここが今回のアプリの一番の課題で、もっとエレガントにできないかな?と思います。
・confirm メソッド
確認画面を表示するためのメソッドで、特に難しいところはなしですね。
・create メソッド
レス書き込み用です。メルアドが sage だったらそのスレッドは、下げ進行。メルアドがそれ以外だったらスレッドをアゲます。
ということをするので、ただ単にレスだけ DB に挿入という訳ではなく、レスが属するスレッドの更新(アゲ日時の更新)も行います。
説明また粗くてスマソ。
おしまい。次回へ続く
【広告】