`
yanzilee9292
  • 浏览: 538376 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Rails3入门锦集(5) 第二个模型: 一对多关系

阅读更多

入门锦集1-8都来自官方的翻译:http://edgeguides.rubyonrails.org/getting_started.html

 

 

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 – 测试文件.
class Comment < ActiveRecord::Base
  belongs_to :post
end
 初看之下,你可能会觉得它与post模型很相识,不同之处在于它多了一行 belongs_to 声明,而这将会建立它与post模型之间的关联, 那么在后面的教程中我们将详细学习。

同时,Rails还生成了迁移文件来创建相应的表:

class CreateComments < ActiveRecord::Migration
  def self.up
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post
 
      t.timestamps
    end
  end
 
  def self.down
    drop_table :comments
  end
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 然后添加下面一行:

class Post < ActiveRecord::Base
  validates :name,  :presence => true
  validates :title, :presence => true,
                    :length => { :minimum => 5 }
 
  has_many :comments
end
 现在双方都已经建立起一系列的关系,打个比方,假如你有一个实例变量 @post 包含一条 post,那么你可以使用 @post.comments 来检索所有该 post 中的 comment。

3. 为comments添加路由
和home控制器一样,我们需要添加一条路由,这样rails可以知道哪里可以看到评论。再次打开 routes.rb 你可以看到上次手脚架自动给posts添加的路由条目,我们编辑下该条目:

resources :posts do
  resources :comments
end
 这将使 comments 资源作为 posts 资源的嵌套资源。而这也反映出 post 与 comment 之间的关系。

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

$ rails g controller comments

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

首先,我们修改下post的show.html.erb模板使之可以创建与显示评论:

<p class="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>
  <b>Title:</b>
  <%= @post.title %>
</p>
 
<p>
  <b>Content:</b>
  <%= @post.content %>
</p>
 
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |
 

这将在post的show页面中显示一个comment表单来创建评论,而这将调用CommentsController中的create方法,如下:

class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
  end
end
 你可能会发现这里要比之前的posts控制器中稍微复杂一些,这就是你之前设定嵌套的片效应。每一个评论的请求需要追踪该评论所附加的Post,所以find首先会找出该Post对象。

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

一旦我们完成了评论的保存,我们就要使用 post_path @post 把用户跳转到原来显示该post的show页面。正如我们所看到的,它调用了PostsController中的show方法来渲染 show.html.erb 模板。这里我们需要显示所有关于该Post的评论,所以让我们更改下 show.html.erb 页面:

<p class="notice"><%= notice %></p>
 
<p>
  <b>Name:</b>
  <%= @post.name %>
</p>
 
<p>
  <b>Title:</b>
  <%= @post.title %>
</p>
 
<p>
  <b>Content:</b>
  <%= @post.content %>
</p>
 
<h2>Comments</h2>
<% @post.comments.each do |comment| %>
  <p>
    <b>Commenter:</b>
    <%= comment.commenter %>
  </p>
 
  <p>
    <b>Comment:</b>
    <%= comment.body %>
  </p>
<% end %>
 
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
 
<br />
 
<%= link_to 'Edit Post', edit_post_path(@post) %> |
<%= link_to 'Back to Posts', posts_path %> |
 现在你可以在你的博客中添加post和评论了,并且把它们显示在正确的地方。


转自: http://onia.iteye.com/blog/826983
分享到:
评论

相关推荐

    Rails入门教程一(翻译).pdf

    模型部分会涉及ActiveRecord的生命周期,包括创建、读取、更新和删除(CRUD)操作,以及关联(Associations)如一对一、一对多、多对多等,这些关联让数据间的复杂关系得以轻松管理。 此外,教程还会涉及表单...

    ruby on rails入门

    #### 第二天:深入 Rails 开发 - **模块**:Rails 支持模块的概念,可以将相关的功能封装在一起。例如,可以定义一个 `ActiveRecord::Base` 模块来添加通用的行为。 - **数据验证**:Rails 提供了强大的数据验证...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **定义**:关联是指定义模型之间的关系,如一对一、一对多等。 - **示例**:例如,在博客系统中,一篇文章可以有多个评论,这就是典型的“一对多”关系。 #### 四、查询 - **方法**:使用Active Record的方法来...

    Ruby on Rails 指南 v5.0.1 中文版

    - **添加第二个模型**:介绍如何添加新的模型到项目中,并演示如何与数据库交互。 - **重构**:强调代码重构的重要性,并给出一些实用的重构技巧。 - **删除评论**:通过一个具体的例子——删除评论功能,展示如何...

    ruby on rails基础知识

    #### 三、创建第一个Rails应用 1. **初始化项目**: 使用命令 `$ rails new blog` 创建一个新的博客项目。 2. **项目结构**: - **Gemfile**: 定义项目依赖的Gem。 - **README**: 项目简介和说明文档。 - **...

    Pragmatic.Bookshelf.Rails.for.Java.Developers.Feb.2007

    - **模型层开发**:深入探讨Active Record和关联管理,包括一对一、一对多和多对多的关系处理。 - **视图层展示**:教授如何使用ERB模板系统和HTML辅助方法来构建用户界面。 - **控制器层逻辑**:介绍如何处理HTTP...

    Agile Web Development with Rails, 4th Edition, Rails 3.1

    - 本书通过实际案例展示了如何使用Active Record进行CRUD(创建、读取、更新、删除)操作,并介绍了关联关系(如一对一、一对多、多对多)的定义和使用方法。 4. **路由管理** - 路由是Web应用的核心组件之一,...

    Agile Web Development with Rails (4th edition).pdf

    ### 敏捷Web开发与Rails框架...通过对Rails框架各个方面的深入解析,结合丰富的实战案例和社区经验分享,本书为读者提供了从入门到精通所需的一切知识。无论是对于初学者还是有经验的开发者来说,这本书都极具价值。

    Ruby on Rail 基础知识 一张纸

    本篇文章旨在提供一个关于Ruby on Rails基础知识的概览,帮助初学者快速上手。 #### 二、方法概述 在Ruby on Rails中,方法是执行特定任务的基本单元。以下列举了一些常用的方法: 1. **字符串处理方法**: - `...

    MongoDB权威指南(中文版)高清

    编辑本段目录录中文版序一 XI中文版序二 XIII序 XV前言 XVII第1章 简介 11.1 丰富的数据模型 11.2 容易扩展 11.3 丰富的功能 21.4 不牺牲速度 31.5 简便的管理 31.6 其他内容 3第2章 入门 52.1...

    有关Ruby入门文章

    Ruby on Rails(简称Rails)是Ruby的一个热门Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。Rails的特色包括ActiveRecord(ORM,对象关系映射)、DHH的约定优于配置(Convention over Configuration,CoC)...

    RoR 培训课程PPT

    - **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据验证和回调函数的应用。 - **ActionView表单**:学习如何在视图层构建动态表单,利用ActionView提供的模板...

    Grails基础教程

    - **一对多关系**:介绍了一对多关系的定义方法,并给出了实际例子。 - **多对多关系**:讲解了多对多关系的处理方式,包括中间表的使用。 - **自关联关系**:讨论了领域类与其自身的关联关系的实现方法。 #### 六...

    Grails in Action

    - **关联关系**:使用注解或方法来声明实体之间的关联关系,如一对多、多对多等。 - **验证规则**:定义验证规则来确保数据的有效性和一致性。 ##### 2. 控制器与视图 - **控制器设计**:负责处理用户的请求,并...

    Android学习之路

    **重要性**: 学习Android开发的基础知识是进入这一领域的第一步。 **知识点**: 1. **UI组件**: 如TextView、Button等。 2. **布局管理器**: LinearLayout、RelativeLayout等。 3. **Activity生命周期**: 创建、...

    ASP.NET MVC 2 in Action 2nd

    - **创建第一个ASP.NET MVC 2项目**:指导读者如何从头开始创建一个新的ASP.NET MVC 2项目。 - **处理用户输入**:介绍如何通过控制器处理用户的输入数据。 - **操作视图**:演示如何显示数据并在视图中呈现不同的...

    java开源包5

    Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式...

Global site tag (gtag.js) - Google Analytics