基于Ruby on Rails的论坛实现(新手指南)

上一篇 / 下一篇  2008-10-12 21:07:37 / 个人分类:Ruby

Rails实现一个简单的论坛系统,大致的架构为:站点拥有多个Forum,每个Forum有多个Topic,而每个Topic又有多个Reply。原文链接:http://railsonedge.blogspot.com/2008/02/rails-forum-tutorial-for-beginners-part.html

我下载的是目前最新的Rails版本2.1,数据库使用的是Sql Server 2000,应用程序所在目录为F:\Ruby\railsdoc\myforum。首先快速地依照以下步骤创建Forum类(上一篇日志《Ruby on Rails 实践 读书笔记二》中有详解):

  1. 执行rails myforum生成完整的目录结构;
  2. 执行ruby script/generate scaffold Forum name:string description:text创建相关的数据库移植文件及model、controller、views文件;
  3. 修改database.yml文件中的相关数据库配置信息;
  4. 在Sql Server中新建名为myforum的数据库,并执行rake db:migrate创建forums表。
  5. 修改environment.rb文件使页面能正常显示中文。

这样Forum页面就完成了,启动服务器后在浏览器键入http://127.0.0.1:3000/forums便能进行CRUD操作了。

删除/public/index.html,修改/config/routes.rb,使得http://localhost:3000直接指向Forum列表:

map.root :controller => 'forums', :action => 'index'

执行以下命令创建Topic和Reply的相关文件及数据库表:

ruby script/generate scaffold Topic forum:references user:references subject:string body:text
ruby script/generate scaffold Reply topic:references user:references subject:string body:text
rake db:migrate

表Forum

表Topic

表Reply

修改/config/routes.rb:

……
map.resources :forums, :has_many => :topics
map.resources :topics, :has_many => :replies

map.resources :replies
……

修改/app/models/forum.rb:

class Forum < ActiveRecord::Base
  has_many :topics
  has_many :replies, :through => :topics

end

修改/app/models/topic.rb:

class Topic < ActiveRecord::Base
  belongs_to :forum
  belongs_to :user
  has_many :replies

end

修改/app/models/reply.rb:

class Reply < ActiveRecord::Base
  belongs_to :topic
  belongs_to :user
end

修改/app/controllers/topics_controller.rb:

class TopicsController < ApplicationController

  before_filter :load_forum
 
  def load_forum
    @forum = Forum.find(params[:forum_id])
  end

  # GET /topics
  # GET /topics.xml
  def index
   @topics = @forum.topics  # Before: @topics = Topic.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @topics }
    end
  end

  # GET /topics/1
  # GET /topics/1.xml
  def show
   @topic = @forum.topics.find(params[:id])  # Before: @topic = Topic.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @topic }
    end
  end

  # GET /topics/new
  # GET /topics/new.xml
  def new
   @topic = @forum.topics.build  # Before: @topic = Topic.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @topic }
    end
  end

  # GET /topics/1/edit
  def edit
   @topic = @forum.topics.find(params[:id])  # Before: @topic = Topic.find(params[:id])
  end

  # POST /topics
  # POST /topics.xml
  def create
   @topic = @forum.topics.build(params[:topic])  # Before: @topic = Topic.new(params[:topic])

    respond_to do |format|
      if @topic.save
        flash[:notice] = 'Topic was successfully created.'
       format.html { redirect_to(@forum) }  # Before: format.html { redirect_to(@topic) }
        format.xml  { render :xml => @topic, :status => :created, :location => @topic }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @topic.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /topics/1
  # PUT /topics/1.xml
  def update
   @topic = @forum.topics.find(params[:id])  # Before: @topic = Topic.find(params[:id])

    respond_to do |format|
      if @topic.update_attributes(params[:topic])
        flash[:notice] = 'Topic was successfully updated.'
       format.html { redirect_to(@forum) }  # Before: format.html { redirect_to(@topic) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @topic.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /topics/1
  # DELETE /topics/1.xml
  def destroy
   @topic = @forum.topics.find(params[:id])  # Before: @topic = Topic.find(params[:id])
    @topic.destroy

    respond_to do |format|
     format.html { redirect_to(forum_topics_url(@forum)) }  # Before: format.html { redirect_to(topics_url) }
      format.xml  { head :ok }
    end
  end
end


TAG: forum rails sqlserver

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2009-01-08  
    123
45678910
11121314151617
18192021222324
25262728293031

我的存档

数据统计

  • 访问量: 0
  • 日志数: 4
  • 建立时间: 2008-10-10
  • 更新时间: 2008-10-12

RSS订阅

Open Toolbar