用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类:
删除/public/index.html,修改/config/routes.rb,使得http://localhost:3000直接指向Forum列表:
分别执行以下命令创建Topic和Reply的相关文件及数据库表:
表Forum
表Topic
表Reply
修改/config/routes.rb
修改/app/models/forum.rb
修改/app/models/topic.rb
修改/app/models/reply.rb
修改/app/controllers/topics_controller.rb
以上修改基于两个目的:一、使得对于Topic的操作能关联到正确的外键(forum_id),二、在对Topic执行CUD操作后将能返回至相应的Forum页面,而不是Topic页面。
将/app/views/forums/show.html.erb
修改为
可以看到/app/views/topics/new.html.erb和/app/views/topics/edit.html.erb相当类似,我们创建一个新的文件/app/views/topics/_topic.html.erb
将/app/views/topics/new.html.erb
修改为
将/app/views/topics/edit.html.erb
修改为
目前部分已完成Forum和Topic的关联,以下是操作页面截图:
Forum List
Topic List
Topic Details
我下载的是目前最新的Rails版本2.1,数据库使用的是Sql Server 2000,应用程序所在目录为F:\Ruby\railsdoc\myforum。首先快速地依照以下步骤创建Forum类:
- 执行rails myforum生成完整的目录结构;
- 执行ruby script/generate scaffold Forum name:string description:text创建相关的数据库移植文件及model、controller、views文件;
- 修改database.yml文件中的相关数据库配置信息;
- 在Sql Server中新建名为myforum的数据库,并执行rake db:migrate创建forums表;
- 修改environment.rb文件使页面能正常显示中文。
删除/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
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
发表评论
-
Everyday Scripting with Ruby 读书笔记(5)
2008-11-19 15:02 998--- 用正则表达式刮取网页 Scraping Web P ... -
Everyday Scripting with Ruby 读书笔记(4)
2008-11-09 19:51 930--- 用类捆绑数据和方法 Classes Bundle ... -
Everyday Scripting with Ruby 读书笔记(3)
2008-10-28 17:22 1000--- 利器在手,正则表达式 Our Friend, the ... -
Everyday Scripting with Ruby 读书笔记(2)
2008-10-28 11:24 1051--- Churn项目:轻松编写脚本 The Churn Pr ... -
Everyday Scripting with Ruby 读书笔记(1)
2008-10-23 17:40 1005--- 第一个脚本:比较文件清单 A First Script ... -
Ruby on Rails 实践
2008-10-19 12:48 2828***** Ruby on Rails 实践 读 ...
相关推荐
- **Ruby on Rails 3**:一种流行的Web开发框架,基于Ruby语言。 - **经典教材**:表明本书是学习Ruby on Rails 3的一个权威且广受好评的资源。 #### 知识点详解 ##### 一、Ruby on Rails 概述 - **定义**:Ruby ...
《Beginning Ruby on Rails》是一本为初学者设计的指南,旨在帮助读者理解并掌握Ruby on Rails框架的基本概念和技术要点。该书由经验丰富的技术作家Steven Holzner撰写,内容全面覆盖了Ruby on Rails的基础知识,并...
本文将基于给定文件信息,详细介绍Ruby on Rails的手动安装步骤,旨在为初学者提供一份教学级的安装指南。 #### 安装前准备 - **Ruby 解释器**:需先安装Ruby解释器,建议选择稳定版本,如Ruby 1.8.6.111。 - **...
根据提供的文件信息,“Ruby on ...综上所述,《Ruby on Rails Bible》这本书几乎覆盖了所有与Rails开发相关的知识领域,无论是对于希望快速上手的新手还是想要进阶学习的老手而言,都是一本非常有价值的参考书籍。
《Ruby on Rails Web 敏捷开发第四版》是一本面向 Ruby on Rails 3 的详细指南。它不仅覆盖了 Rails 的基础知识,还深入探讨了一些高级主题。通过本书的学习,读者将能够建立起对 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》是一个全面的资源,无论你是Rails新手还是资深开发者,都能从中学习到如何为Rails应用编写高质量的测试。从理论到实践,从单元测试...
### 快速安装Ruby on Rails的简明指南 #### 知识点概览 - **基础知识**:了解Ruby on Rails框架及其重要性。 - **系统准备**:选择合适的操作系统进行安装。 - **基础软件安装**:包括Xcode、Homebrew等必备工具。 ...
如何学习 Ruby on Rails 介绍 标题:在修改 Craiglist 克隆时学习 Ruby on Rails 副标题:深入了解核心 Ruby on Rails 概念 在本交互式教程中,您将通过修改 Craigslist 克隆来学习 Ruby 和 Ruby on Rails 基础知识...
**Ruby on Rails(RoR)** 是一个基于Ruby编程语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。RoR的核心理念是“Don't Repeat Yourself”(DRY)和“Convention ...
Ruby on Rails是一种基于Ruby语言的开源Web应用框架,遵循MVC(Model-View-Controller)设计模式。它以其优雅的语法、高效的开发速度以及“约定优于配置”的理念而闻名于世,极大地简化了Web应用的开发过程。此外,...
Ruby on Rails,简称Rails,是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web应用的开发流程。Rails以其“约定优于配置”的理念,鼓励开发者遵循一套最佳...
《Rails 101S》是一本为Ruby on Rails初学者准备的手册,旨在帮助新手快速入门并掌握基本的开发技能。本手册将从最基础的概念入手,逐步深入到实际项目的构建过程。 #### HelloWorld: 快速体验Ruby on Rails - **...
Ruby on Rails 是一个强大的、基于模型-视图-控制器(MVC)架构模式的开源 web 应用程序开发框架,以其简洁、高效和可扩展性而闻名。在"roriot-tutorial"教程中,我们将学习如何将 RoR 的优势应用于 IoT 领域。 首先...
Ruby on Rails(RoR)是基于Ruby的开源Web应用程序框架,遵循Model-View-Controller(MVC)架构模式。RoR强调“约定优于配置”,使得开发过程更为高效。它包含了一系列预置的约定和工具,如ActiveRecord(用于数据库...
Ruby on Rails(简称Rails)是一种基于Ruby语言的网络应用程序开发框架,它遵循MVC(Model-View-Controller)架构模式,强调代码的简洁性和开发效率。Rails通过其强大的ORM(对象关系映射)系统ActiveRecord,简化了...
本书通过构建一个面向Ruby社区的社交网络平台——RailsSpace,来帮助读者掌握Ruby on Rails的核心概念和技术。本书不仅适合初学者,也适合有一定基础并希望深入了解Rails框架的开发者。 #### 二、基础知识篇 #####...