fc2ブログ

2023.08 «  - - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 » 2023.10
TOP > 掲示板を作ってみる・その8【レス用コントローラを編集】

 ← 掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】 | TOP | 掲示板を作ってみる・その7【スレッド用コントローラを編集】

掲示板を作ってみる・その8【レス用コントローラを編集】 

2008年08月08日 ()

掲示板を作ってみる・その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 に挿入という訳ではなく、レスが属するスレッドの更新(アゲ日時の更新)も行います。

説明また粗くてスマソ。

おしまい。次回へ続く


【広告】

[2008.08.08(Fri) 11:23] 掲示板アプリTrackback(0) | Comments(0)
↑TOPへ

 ← 掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】 | TOP | 掲示板を作ってみる・その7【スレッド用コントローラを編集】

COMMENT

COMMENT POST















管理者にだけ表示

 ← 掲示板を作ってみる・その9【レイアウトファイルとスタイルシートファイルを作成】 | TOP | 掲示板を作ってみる・その7【スレッド用コントローラを編集】