`
sco.struts
  • 浏览: 18905 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

    博客分类:
  • 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类:

  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  # Add
map.resources :topics, :has_many => :replies  # Add
map.resources :replies
…… 


修改/app/models/forum.rb
class Forum < ActiveRecord::Base
  has_many :topics  # Add
  has_many :replies, :through => :topics  # Add
end


修改/app/models/topic.rb
class Topic < ActiveRecord::Base
  belongs_to :forum  # Add
  belongs_to :user  # Add
  has_many :replies  # Add
end


修改/app/models/reply.rb
class Reply < ActiveRecord::Base
  belongs_to :topic  # Add
  belongs_to :user  # Add
end


修改/app/controllers/topics_controller.rb
class TopicsController < ApplicationController
  before_filter :load_forum  # Add
 
  def load_forum  # Add
    @forum = Forum.find(params[:forum_id])  # Add
  end  # Add

  # GET /topics
  # GET /topics.xml
  def index
   @topics = @forum.topics  # Edit: @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])  # Edit: @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  # Edit: @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])  # Edit: @topic = Topic.find(params[:id])
  end

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

    respond_to do |format|
      if @topic.save
        flash[:notice] = 'Topic was successfully created.'
       format.html { redirect_to(@forum) }  # Edit: 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])  # Edit: @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) }  # Edit: 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])  # Edit: @topic = Topic.find(params[:id])
    @topic.destroy

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


以上修改基于两个目的:一、使得对于Topic的操作能关联到正确的外键(forum_id),二、在对Topic执行CUD操作后将能返回至相应的Forum页面,而不是Topic页面。

将/app/views/forums/show.html.erb
<p>
  <b>Name:</b>
  <%=h @forum.name %>
</p>

<p>
  <b>Description:</b>
  <%=h @forum.description %>
</p>


<%= link_to 'Edit', edit_forum_path(@forum) %> |
<%= link_to 'Back', forums_path %>

修改为
<p>
  <b>Forum:</b>
  <%=h @forum.name %> - <%=h @forum.description %>
</p>

<% unless @forum.topics.empty? %>
  <h2>Topics</h2>
  <% @forum.topics.each do |topic| %>
    <b><%= link_to topic.subject, [@forum, topic] %></b><br />    
  <% end %>
<% end %>

<h2>New Post</h2>
<%= render :partial => @topic = Topic.new, :locals => { :button_name => 'Create' } %>

<%= link_to 'Edit', edit_forum_path(@forum) %> |
<%= link_to 'Back', forums_path %>


可以看到/app/views/topics/new.html.erb和/app/views/topics/edit.html.erb相当类似,我们创建一个新的文件/app/views/topics/_topic.html.erb
<% form_for([@forum, @topic]) do |f| %>
  <p>
    <b>Subject</b><br />
    <%= f.text_field :subject %>
  </p>

  <p>
    <b>Body</b><br />
    <%= f.text_area :body %>
  </p>

  <p>
    <%= f.submit button_name %>
  </p>
<% end %>


将/app/views/topics/new.html.erb
<h1>New topic</h1>

<% form_for(@topic) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :forum %><br />
    <%= f.text_field :forum %>
  </p>
  <p>
    <%= f.label :user %><br />
    <%= f.text_field :user %>
  </p>
  <p>
    <%= f.label :subject %><br />
    <%= f.text_field :subject %>
  </p>
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit "Create" %>
  </p>
<% end %>

<%= link_to 'Back', topics_path %>

修改为
<h1>New topic</h1>

<%= error_messages_for :topic %>

<%= render :partial => @topic, :locals => { :button_name => "Create" } %>

<%= link_to 'Back', topics_path %>


将/app/views/topics/edit.html.erb
<h1>Editing topic</h1>

<% form_for(@topic) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :forum %><br />
    <%= f.text_field :forum %>
  </p>
  <p>
    <%= f.label :user %><br />
    <%= f.text_field :user %>
  </p>
  <p>
    <%= f.label :subject %><br />
    <%= f.text_field :subject %>
  </p>
  <p>
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit "Update" %>
  </p>
<% end %>

<%= link_to 'Show', @topic %> |
<%= link_to 'Back', topics_path %>

修改为
<h1>Editing topic</h1>

<%= error_messages_for :topic %>

<%= render :partial => @topic, :locals => { :button_name => "Submit" } %>

<%= link_to 'Show', [@forum, @topic] %> |
<%= link_to 'Back', topics_path %>


目前部分已完成Forum和Topic的关联,以下是操作页面截图:
Forum List


Topic List


Topic Details
  • 大小: 38 KB
  • 大小: 46 KB
  • 大小: 46.2 KB
  • 大小: 43 KB
  • 大小: 53.4 KB
  • 大小: 40.4 KB
分享到:
评论

相关推荐

    Ruby on Rails 3 Tutorial

    - **Ruby on Rails 3**:一种流行的Web开发框架,基于Ruby语言。 - **经典教材**:表明本书是学习Ruby on Rails 3的一个权威且广受好评的资源。 #### 知识点详解 ##### 一、Ruby on Rails 概述 - **定义**:Ruby ...

    Wrox - Beginning Ruby on Rails

    《Beginning Ruby on Rails》是一本为初学者设计的指南,旨在帮助读者理解并掌握Ruby on Rails框架的基本概念和技术要点。该书由经验丰富的技术作家Steven Holzner撰写,内容全面覆盖了Ruby on Rails的基础知识,并...

    教学级Ruby On Rails 手动安装.pdf

    本文将基于给定文件信息,详细介绍Ruby on Rails的手动安装步骤,旨在为初学者提供一份教学级的安装指南。 #### 安装前准备 - **Ruby 解释器**:需先安装Ruby解释器,建议选择稳定版本,如Ruby 1.8.6.111。 - **...

    Ruby on Rails Bible.pdf

    根据提供的文件信息,“Ruby on ...综上所述,《Ruby on Rails Bible》这本书几乎覆盖了所有与Rails开发相关的知识领域,无论是对于希望快速上手的新手还是想要进阶学习的老手而言,都是一本非常有价值的参考书籍。

    ruby on rails web敏捷开发第四版(英文)

    《Ruby on Rails Web 敏捷开发第四版》是一本面向 Ruby on Rails 3 的详细指南。它不仅覆盖了 Rails 的基础知识,还深入探讨了一些高级主题。通过本书的学习,读者将能够建立起对 Rails 框架的强大理解,并掌握如何...

    Ruby on Rails入门例子

    【Ruby on Rails 入门例子】是一篇针对初学者的教程,旨在帮助新手快速了解并掌握Ruby on Rails框架的基本概念和应用。Rails是基于Ruby语言的开源Web开发框架,它遵循MVC(Model-View-Controller)架构模式,强调...

    Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf

    综上所述,《Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf》是一个全面的资源,无论你是Rails新手还是资深开发者,都能从中学习到如何为Rails应用编写高质量的测试。从理论到实践,从单元测试...

    快速安装Ruby on Rails的简明指南

    ### 快速安装Ruby on Rails的简明指南 #### 知识点概览 - **基础知识**:了解Ruby on Rails框架及其重要性。 - **系统准备**:选择合适的操作系统进行安装。 - **基础软件安装**:包括Xcode、Homebrew等必备工具。 ...

    guide-how-to-learn-ruby-on-rails:Thinkful 创建的 Ruby on Rails 介绍指南

    如何学习 Ruby on Rails 介绍 标题:在修改 Craiglist 克隆时学习 Ruby on Rails 副标题:深入了解核心 Ruby on Rails 概念 在本交互式教程中,您将通过修改 Craigslist 克隆来学习 Ruby 和 Ruby on Rails 基础知识...

    RAILS ON RUBY

    **Ruby on Rails(RoR)** 是一个基于Ruby编程语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。RoR的核心理念是“Don't Repeat Yourself”(DRY)和“Convention ...

    rails2-sample

    Ruby on Rails是一种基于Ruby语言的开源Web应用框架,遵循MVC(Model-View-Controller)设计模式。它以其优雅的语法、高效的开发速度以及“约定优于配置”的理念而闻名于世,极大地简化了Web应用的开发过程。此外,...

    rails的经典学习项目

    Ruby on Rails,简称Rails,是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web应用的开发流程。Rails以其“约定优于配置”的理念,鼓励开发者遵循一套最佳...

    Rails 101S

    《Rails 101S》是一本为Ruby on Rails初学者准备的手册,旨在帮助新手快速入门并掌握基本的开发技能。本手册将从最基础的概念入手,逐步深入到实际项目的构建过程。 #### HelloWorld: 快速体验Ruby on Rails - **...

    roriot-tutorial:物联网服务器应用程序的 Ruby on Rails 教程

    Ruby on Rails 是一个强大的、基于模型-视图-控制器(MVC)架构模式的开源 web 应用程序开发框架,以其简洁、高效和可扩展性而闻名。在"roriot-tutorial"教程中,我们将学习如何将 RoR 的优势应用于 IoT 领域。 首先...

    ruby入门书中文版

    Ruby on Rails(RoR)是基于Ruby的开源Web应用程序框架,遵循Model-View-Controller(MVC)架构模式。RoR强调“约定优于配置”,使得开发过程更为高效。它包含了一系列预置的约定和工具,如ActiveRecord(用于数据库...

    SitePoint[1].Simply.Rails.2.2nd.Edition.May.2008.pdf

    Ruby on Rails(简称Rails)是一种基于Ruby语言的网络应用程序开发框架,它遵循MVC(Model-View-Controller)架构模式,强调代码的简洁性和开发效率。Rails通过其强大的ORM(对象关系映射)系统ActiveRecord,简化了...

    RailsSpace

    本书通过构建一个面向Ruby社区的社交网络平台——RailsSpace,来帮助读者掌握Ruby on Rails的核心概念和技术。本书不仅适合初学者,也适合有一定基础并希望深入了解Rails框架的开发者。 #### 二、基础知识篇 #####...

Global site tag (gtag.js) - Google Analytics