Links ?

Part 2 / 3 : The Controller

Keat | url
on Mon Sep 13 20:59:00 SGT 2004

The Rails new_controller script would've generated something like the following:

require 'abstract_application'
require 'forum_helper'
class ForumController < AbstractApplicationController
  include ForumHelper

end
For our purpose, we'll need to change a few things:
  1. When showing a Post, show all its Comments as well
  2. Override default "List comments" function to "List Posts" instead.
  3. When doing "List Posts", exclude Comments stored in the same table
With those requirements, I present:
require 'abstract_application'
require 'forum_helper'
require 'post'
require 'comment'

class ForumController < AbstractApplicationController
  include ForumHelper

  scaffold :post
  scaffold :comment, :suffix => true

  def show
    # when showing a Post, i need to retrieve all the comments too
    # thus @post and @comments is populated here.
    sqlId = ForumController.quote(@params["id"])
    @post = Post.find(@params["id"]);
    @comments = Comment.find_all "post_id = #{sqlId}"

    # after populating our variables, we'll call scaffold to render
    # using the 'show.rhtml'
    render_scaffold
  end

  def list_comment
    # default action "list_comment" will show all the comments in
    # the database, doesn't make sense in our app - so redirect to
    # the list topics screen

    list
  end

  def list
    # The 'type' column is automagically used by Rails.. when inserting
    # a comment, it put 'Comment' as its 'type' value
    # Hence, to get all the topics, we'll get the 'type is null'..

    @posts = Post.find_all "type is null order by created_at desc limit 30"
    render_scaffold
  end

  # Java programmers, this is a static / class function
  # Putting this function here because I still haven't learnt to
  # use Rails / ActiveRecord for this purpose..
  def ForumController.quote(value)
    case value
      when String              then "'#{value.gsub(/\\/,'\&\&').gsub(/'/, "''")}'" # ' (for ruby-mode)
      when NilClass            then "NULL"
      when Float, Fixnum, Date then "'#{value.to_s}'"
      when Time, DateTime      then "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
      else                          "'#{value.to_yaml}'"
    end
  end

end
If you're ready. We'll move on to the 'view' portion of the MVC pattern.

<< Back | Comment | Edit | Delete