`

ruby on rails入门教程之post构建五(模型2)

 
阅读更多

1. 添加第二个模型

在前面的教程中,我们已经学会的使用脚手架快速搭建一个简单的应用,毕竟脚手架不能做任何事情,现在我们需要在应用中添加第二个模型了。

模型在rails中使用单数形式,而其相关的数据库将使用复数名称。

那么对于一个博客来说,评论总是少不了的,我们现在就要创建一个 Comment 模型。对于大多数的 rails 程序员来说,一般都是通过rails的生成器来生成模型,在这里我们也一样:

$ rails g model comment commenter:string body:text post:references

该命令将创建4个文件:

  • app/models/comment.rb – 模型
  • db/migrate/20101128142329_create_comments.rb – 迁移文件
  • test/unit/comment_test.rb and test/fixtures/comments.yml – 测试文件.
首先,我们看一下 comment.rb
  1. class  Comment < ActiveRecord::Base  
  2.   belongs_to :post   
  3. end   
初看之下,你可能会觉得它与post模型很相识,不同之处在于它多了一行 belongs_to 声明,而这将会建立它与post模型之间的关联, 那么在后面的教程中我们将详细学习。

同时,Rails还生成了迁移文件来创建相应的表:
  1. class  CreateComments < ActiveRecord::Migration  
  2.   def   self .up  
  3.     create_table :comments   do  |t|  
  4.       t.string :commenter   
  5.       t.text :body   
  6.       t.references :post   
  7.    
  8.       t.timestamps  
  9.     end   
  10.   end   
  11.    
  12.   def   self .down  
  13.     drop_table :comments   
  14.   end   
  15. end   
与之前的rails版本不同,这里多了一个 t.references 定义。t.references :post 将建立一个posts表的外键 post_id, 值得注意的是这里的 :post 指的模型而不是表,这点一定要搞清楚。
现在运行迁移操作把:

$ rake db:migrate

2. 关联模型
Active Record的关联让你很容易的声明模型之间的关系。对于Posts和Comments, 很明显是一对多的关系。
前面rails已经为我们声明了 belongs_to 关系,现在我们需要再声明一个 has_many 关系, 打开 post.rb 然后添加下面一行:
  1. class  Post < ActiveRecord::Base  
  2.   validates :name ,   :presence  =>  true   
  3.   validates :title :presence  =>  true ,  
  4.                     :length  => {  :minimum  => 5 }  
  5.    
  6.   has_many :comments
  7. end   
现在双方都已经建立起一系列的关系,打个比方,假如你有一个实例变量 @post 包含一条 post,那么你可以使用 @post.comments 来检索所有该 post 中的 comment。

3. 为comments添加路由
和home控制器一样,我们需要添加一条路由,这样rails可以知道哪里可以看到评论。再次打开 routes.rb 你可以看到上次手脚架自动给posts添加的路由条目,我们编辑下该条目:
  1. resources  :posts   do   
  2.   resources :comments   
  3. end   
这将使 comments 资源作为 posts 资源的嵌套资源。而这也反映出 post 与 comment 之间的关系。

4. 生成控制器
模型有了,现在你需要创建comments控制器了,同样我们使用生成器来创建该控制器:

$ rails g controller comments

与任何博客一样,我们的读者将在他们阅读文章后直接添加评论,一旦完成评论的添加,他们将跳转到post的show页面,所以,我们的CommnetsController仅需提供创建以及删除垃圾评论的方法即可。

首先,我们修改下post的show.html.erb模板使之可以创建与显示评论:
  1. < p   class = "notice" > < %= notice % > </ p >   
  2.    
  3. < p >   
  4.   < b > Name: </ b >   
  5.   < %= @post.name % >   
  6. </ p >   
  7.    
  8. < p >   
  9.   < b > Title: </ b >   
  10.   < %= @post.title % >   
  11. </ p >   
  12.    
  13. < p >   
  14.   < b > Content: </ b >   
  15.   < %= @post.content % >   
  16. </ p >   
  17.    
  18. < h2 > Add a comment: </ h2 >   
  19. < %= form_for([@post, @post.comments.build]) do |f| % >   
  20.   < div   class = "field" >   
  21.     < %= f.label :commenter % > < br   />   
  22.     < %= f.text_field :commenter % >   
  23.   </ div >   
  24.   < div   class = "field" >   
  25.     < %= f.label :body % > < br   />   
  26.     < %= f.text_area :body % >   
  27.   </ div >   
  28.   < div   class = "actions" >   
  29.     < %= f.submit % >   
  30.   </ div >   
  31. < % end % >   
  32.    
  33. < %= link_to 'Edit Post', edit_post_path(@post) % >  |  
  34. < %= link_to 'Back to Posts', posts_path % >  |  
这将在post的show页面中显示一个comment表单来创建评论,而这将调用CommentsController中的create方法,如下:
  1. class  CommentsController < ApplicationController  
  2.   def  create  
  3.     @post  = Post.find(params[ :post_id ])  
  4.     @comment  =  @post .comments.create(params[ :comment ])  
  5.     redirect_to post_path(@post )  
  6.   end   
  7. end   
你可能会发现这里要比之前的posts控制器中稍微复杂一些,这就是你之前设定嵌套的片效应。每一个评论的请求需要追踪该评论所附加的Post,所以find首先会找出该Post对象。

接下来,代码调用了关联中存在的方法,我们在这里使用create方法来创建并保存该条评论,这将自动关联到对应的post记录。

一旦我们完成了评论的保存,我们就要使用 post_path @post 把用户跳转到原来显示该post的show页面。正如我们所看到的,它调用了PostsController中的show方法来渲染 show.html.erb 模板。这里我们需要显示所有关于该Post的评论,所以让我们更改下 show.html.erb 页面:
  1. < p   class = "notice" > < %= notice % > </ p >   
  2.    
  3. < p >   
  4.   < b > Name: </ b >   
  5.   < %= @post.name % >   
  6. </ p >   
  7.    
  8. < p >   
  9.   < b > Title: </ b >   
  10.   < %= @post.title % >   
  11. </ p >   
  12.    
  13. < p >   
  14.   < b > Content: </ b >   
  15.   < %= @post.content % >   
  16. </ p >   
  17.    
  18. < h2 > Comments </ h2 >   
  19. < % @post.comments.each do |comment| % >   
  20.   < p >   
  21.     < b > Commenter: </ b >   
  22.     < %= comment.commenter % >   
  23.   </ p >   
  24.    
  25.   < p >   
  26.     < b > Comment: </ b >   
  27.     < %= comment.body % >   
  28.   </ p >   
  29. < % end % >   
  30.    
  31. < h2 > Add a comment: </ h2 >   
  32. < %= form_for([@post, @post.comments.build]) do |f| % >   
  33.   < div   class = "field" >   
  34.     < %= f.label :commenter % > < br   />   
  35.     < %= f.text_field :commenter % >   
  36.   </ div >   
  37.   < div   class = "field" >   
  38.     < %= f.label :body % > < br   />   
  39.     < %= f.text_area :body % >   
  40.   </ div >   
  41.   < div   class = "actions" >   
  42.     < %= f.submit % >   
  43.   </ div >   
  44. < % end % >   
  45.    
  46. < br   />   
  47.    
  48. < %= link_to 'Edit Post', edit_post_path(@post) % >  |  
  49. < %= link_to 'Back to Posts', posts_path % >  |  
现在你可以在你的博客中添加post和评论了,并且把它们显示在正确的地方。
分享到:
评论

相关推荐

    Ruby on Rails入门例子

    在"Ruby on Rails入门例子"中,我们可能会遇到以下关键概念: - **路由(Routes)**:Rails的路由系统将URL映射到特定的控制器动作,定义了应用的导航结构。在`config/routes.rb`文件中配置路由规则。 - **生成器...

    Rails 101 入门电子书

    本书主要针对的是希望学习Ruby on Rails框架的读者,特别是那些想要从零开始掌握这项技术的新手。 #### 二、作者介绍与背景 - **作者**: xdite,一位经验丰富的开发者,专注于Ruby on Rails框架。 - **作品**: ...

    RailsGuides中那个blog程序源码

    **Ruby on Rails(RoR)** 是一个基于Ruby语言的开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,用于构建高效、简洁和可维护的Web应用。RailsGuides中的"blog"程序是一个典型的入门级示例,旨在帮助初学...

    ruby 入门练习上手项目

    8. **Ruby on Rails框架**:虽然标题没有明确提及,但`hello_rails-master`这个文件名暗示了你可能接触的是Rails,它是Ruby的一个Web开发框架。你将学习到MVC(模型-视图-控制器)架构,路由,数据库交互...

    10分钟创建一个Ruby博客

    2. **Ruby on Rails框架**:Ruby博客系统很可能使用了Ruby on Rails,这是一个流行的Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。Rails提供了许多便利的功能,如ActiveRecord用于数据库操作,Action...

    Apress.Beginning.Rails.3

    - **定义**:Ruby on Rails(简称 Rails 或 RoR)是一种用于快速开发 Web 应用程序的模型-视图-控制器(MVC)框架,由David Heinemeier Hansson创建。 - **特点**:Rails强调代码的简洁性和开发效率,遵循“约定优于...

    rails-blog-example:Rails入门博客应用程序

    【Rails入门博客应用程序】是一个基于Ruby编程语言的Web应用程序示例,主要展示了如何使用Ruby on Rails框架构建一个简单的博客系统。Ruby on Rails(简称Rails)是用于构建动态、交互式网站的开源框架,它遵循MVC...

    rottenpotatoes-rails-intro

    Ruby on Rails(简称Rails)是一个流行的开源Web应用框架,它遵循“模型-视图-控制器”(MVC)架构模式,使得构建动态、数据驱动的网站变得更加高效。 在Ruby on Rails中,"模型"负责处理数据和业务逻辑,"视图"负责...

    RubyGettingStarted

    Ruby编程语言介绍 Ruby是一种面向对象的、动态类型的编程语言...Ruby on Rails框架则为构建Web应用提供了高效的工具和实践,促进了敏捷开发。通过不断学习和实践,你可以掌握Ruby编程,从而在IT行业中发挥出它的潜力。

    Restful webservice

    - **Ruby on Rails: Up and Running**:适合初学者快速入门 Rails 框架。 - **Web Services on Rails**:专门讨论在 Rails 应用中集成 Web 服务的技术和实践。 此外,O'Reilly 提供了丰富的在线资源和服务,如 ...

    HW2-Rotten土豆

    Ruby是一种面向对象的、动态且易于学习的编程语言,而Ruby on Rails(简称Rails)是建立在Ruby之上的一个开源Web开发框架,它遵循MVC(模型-视图-控制器)架构模式,使开发过程更高效。 在这个"入门"阶段,学生将...

    ASP.NET MVC 2 in Action 2nd

    MVC模式是一种软件架构模式,最初由Trygve Reenskaug在1970年代基于Smalltalk社区的工作提出,后来随着2003年Ruby on Rails框架的兴起而变得流行起来。MVC模式的核心思想是将应用程序分为三个主要部分: 1. **Model...

    Android学习基本路线指导.

    - Ruby on Rails是一种基于Ruby语言的Web开发框架,以其简洁性和开发效率著称。 - 学习Ruby语言基础,掌握Rails框架的核心概念,如ActiveRecord ORM。 ### 结论 学习Android开发是一个长期的过程,需要不断积累...

    Cake框架

    在某种程度上,CakePHP可以被看作是PHP世界里的“Ruby on Rails”,它强调的是代码自动生成、约定优于配置的原则,以及减少样板代码的编写。 #### 二、环境搭建与配置 ##### 2.1 下载与安装 1. **下载最新版本**...

    Grails基础教程

    - **吸取的经验教训**:Grails借鉴了Ruby on Rails的成功经验,同时结合Java生态系统的优点,为开发者提供了一种高效、灵活且易于使用的开发方式。 **1.5 使用Grails的原因** - **生产力高**:Grails通过减少代码...

Global site tag (gtag.js) - Google Analytics