Rails 增加一个模型(model)
之前我们已经看到用脚手架运行的model程序。现在是时候第二个model了。
第二个model用来处理post的评论。
7.1 新建一个模型
Rails模型使用一个单一的的名称,其相应的数据库表使用复数名称。
像模型来处理comments表,模型的名字所comment。即使你不想使用
脚手架来产生全部代码。很多程序还是用generators来产生控制器和模型。
新建一个模型可以像下面一样:运行命令。
- $ rails generate model Comment commenter:string body:text post:references
这个命令将会生成下面几个文件
- app/models/comment.rb – 模型文件
- db/migrate/20100207235629_create_comments.rb – DB整合文件
- test/unit/comment_test.rb and test/fixtures/comments.yml –测试配置文件
首先我们看下模型文件
- class Comment < ActiveRecord::Base
- belongs_to :post
- end
这个和post.rb非常类似。不同点就是这有个belongs_to :post.
这是activerecord的关系设置。你将会在下面学到更多关于设定表之间的关系。
除了增加模型之外,rails还生成了创建表的整合代码。
- class CreateComments < ActiveRecord::Migration
- def change
- create_table :comments do |t|
- t.string :commenter
- t.text :body
- t.references :post
- t.timestamps
- end
- add_index :comments, :post_id
- end
- end
t.references这行是设定和post模型的外键。
add_index这行是设定这个外键作为索引。
继续向下进行db整合运行
- $ rake db:migrate
rails是足够聪明的,他只运行DB中还没有运行的整合。
- == CreateComments: migrating =================================================
- -- create_table(:comments)
- -> 0.0017s
- == CreateComments: migrated (0.0018s) ========================================
7.2 关联模型
ActiveRecord可以让你很简单的设定2个模型之间的关系。在comments和posts2个模型之间,
你可以通过这个方式写出他们的关系。
- 每个comment 属于一个 post (1对1)
- 一个post 有很多的 comments (1对多)
事实上,rails使用非常接近的语法来声明这种关系。你已经看到在comment模型代码中,
声明了每个comment属于一个post。
- class Comment < ActiveRecord::Base
- belongs_to :post
- end
你需要编辑post.rb模型代码来声明上面的一对多关系。
- class Post < ActiveRecord::Base
- validates :name, :presence => true
- validates :title, :presence => true, :length => { :minimum => 5 }
- has_many :comments
- end
这2个声明可以使用很多自动行为。例如:如果你有一个实例变量
@post包含
一个post,你可以取得所有属于post的comments。通过
@post.comments方法返回一个数组。
7.3 给comments增加一个路由
像我们设置主页一样。我们需要增加一个路由来让我们导航可以浏览
comments。打开config/routes.rb文件,你将会发现posts已经在里面了。
这是由脚手架自动生成的。编辑他们像下面一样。
- resources :posts do
- resources :comments
- end
这个建立comments是一个posts的嵌套资源。这是捕捉post和comment之间存在层次关系的另一部分。
7.4 产生一个控制器
模型产生完之后。是时候产生对应的控制器了。
- $ rails generate controller Comments
这个命令产生了6个文件和一个空文件夹。
- app/controllers/comments_controller.rb – 控制器
- app/helpers/comments_helper.rb – 视图的帮助文件
- test/functional/comments_controller_test.rb – 控制器的测试程序
- test/unit/helpers/comments_helper_test.rb – 帮助的测试代码
- app/views/comments/ – 控制器的视图代码放在这
- app/assets/stylesheets/comment.css.scss – 控制器的样式
- app/assets/javascripts/comment.js.coffee – 控制器的CoffeeScript
像很多博客一样,我们的读者将会创建评论在读完博客之后。一旦他们评论完,
将会调用post的显示页面,可以看到他们的评论。根据这些,我们的CommentsController
应该提供创建评论和删除垃圾评论的方法。
所以首先我们修改post的显示页面(/app/views/posts/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 %> |
这个加进去的form是新建一个新的评论,将会调用
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
你会看到这里面的处理会比post控制器的处理稍微复杂一点。这个设置了一个嵌套机制。每个评论都会跟随post。
所以在一开始进行了Post的查找。
同时,代码使用了模型关联的一些方法。我们使用@post.comments的create方法来新建保存评论。
这个将会自动连接comment因为他从属于post。
一旦我们新建完评论,我们将用户回到原来的页面通过post_path(@post)。
正如我们所看到的,他将会调用PostsController的show动作,这时候我们希望
评论显示在此页面上。所以我们修改页面代码。
- <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 %> |
这样的话,你可以增加博客和评论,他们可以显示在正确的位置
Rails 增加一个模型(model)的更多相关文章
- phpcms 在后台增加了一个模型的话,在数据库中就会相应的增加数据库表
在phpcms后台管理系统中,我们如果增加一个新的模型的话,例如名为:测试模型,英文名:test 在添加完成后,我们在数据库中发现增加了两个数据表:v9_test,v9_test_data;
- Rails 建立一个资源
在blog 应用程序中.你可以通过脚手架(scaffolded)开始建立一个资源. 这将是单一的blog 提交.请输入以下命令 $ rails generate scaffold Post name: ...
- ASP.NET MVC 5 - 添加一个模型
在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...
- 【再探backbone 01】模型-Model
前言 点保存时候不注意发出来了,有需要的朋友将就看吧,还在更新...... 几个月前学习了一下backbone,这段时间也用了下,感觉之前对backbone的学习很是基础,前几天有个园友问我如何将路由 ...
- [转]ASP.NET MVC 5 - 添加一个模型
在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...
- Django模型Model的定义
概述 Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库. 模型.属性.表.字段间的关系 一个模型类在数据库中对应一张表, ...
- Add an Item to the New Action 在新建按钮中增加一个条目
In this lesson, you will learn how to add an item to the New Action (NewObjectViewController.NewObje ...
- Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数
11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...
- Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型
11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...
随机推荐
- Windows Phone 放开政策 - 应用内支付(IAP)可加入三方支付
Windows Phone 应用商店在 今年(2013)11月04号 修改了商店政策 允许公司账户的应用使用三方支付SDK. 通过 App certification requirements cha ...
- C#写文本文件,如何换行(添加换行符)
把文本写到文件中,如果是几段文字拼合起来输出到文件中,通常每段非结尾文字后需要添加换行符,不然几段文字都变成一段. 在 C# 中,文本换行有两种方法,一种在需要换行的文本后面添加换行符 \r\n 即可 ...
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...
- Android学习之ViewPager
1.定义 ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view.其中,android.support.v4是谷歌公司为了解决当前版本碎片化的问题,从而提供的一 ...
- VC API常用函数简单例子大全(1-89)
第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...
- poj1456---贪心
题目大意: 有n个商品,每个商品有价值和一个最后期限,过了这个期限该商品就不能卖出去了 问你如何去卖,能得到最大的收益.(每个东西卖一天,不能同时卖两种东西) 思路: 贪心: 先按价值对商品排序,价值 ...
- SharedFile System Master Slave(共享文件系统)做ActiveMQ集群
WINDOWS环境下:http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.9.0/apache-activemq ...
- docker容器的基本操作
docker容器是独立运行的一个或一组应用,以及它们的运行态环境.下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等. 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启 ...
- webpack初学者(1)
最近在学习webpack的总结,不完善的希望各位提出宝贵的建议.本篇是以webpack3.0版本为基础的学习总结. 一.webpack的概念及作用 wepack是一个模块打包兼优化工具.往往一个项目中 ...
- springMvc的执行流程(源码分析)
1.在springMvc中负责处理请求的类为DispatcherServlet,这个类与我们传统的Servlet是一样的.我们来看看它的继承图 2. 我们发现DispatcherServlet也继承了 ...