Rails3入门之七 增加一个模型(model)
2011-11-10 23:09
92 查看
之前我们已经看到用脚手架运行的model程序。现在是时候第二个model了。
第二个model用来处理post的评论。
7.1 新建一个模型
Rails模型使用一个单一的的名称,其相应的数据库表使用复数名称。
像模型来处理comments表,模型的名字所comment。即使你不想使用
脚手架来产生全部代码。很多程序还是用generators来产生控制器和模型。
新建一个模型可以像下面一样:运行命令。
app/models/comment.rb – 模型文件
db/migrate/20100207235629_create_comments.rb – DB整合文件
test/unit/comment_test.rb and test/fixtures/comments.yml –测试配置文件
首先我们看下模型文件
这个和post.rb非常类似。不同点就是这有个belongs_to :post.
这是activerecord的关系设置。你将会在下面学到更多关于设定表之间的关系。
除了增加模型之外,rails还生成了创建表的整合代码。
add_index这行是设定这个外键作为索引。
继续向下进行db整合运行
7.2 关联模型
ActiveRecord可以让你很简单的设定2个模型之间的关系。在comments和posts2个模型之间,
你可以通过这个方式写出他们的关系。
每个comment 属于一个 post (1对1)
一个post 有很多的 comments (1对多)
事实上,rails使用非常接近的语法来声明这种关系。你已经看到在comment模型代码中,
声明了每个comment属于一个post。
你需要编辑post.rb模型代码来声明上面的一对多关系。
这2个声明可以使用很多自动行为。例如:如果你有一个实例变量
@post包含
一个post,你可以取得所有属于post的comments。通过
@post.comments方法返回一个数组。
7.3 给comments增加一个路由
像我们设置主页一样。我们需要增加一个路由来让我们导航可以浏览
comments。打开config/routes.rb文件,你将会发现posts已经在里面了。
这是由脚手架自动生成的。编辑他们像下面一样。
这个建立comments是一个posts的嵌套资源。这是捕捉post和comment之间存在层次关系的另一部分。
7.4 产生一个控制器
模型产生完之后。是时候产生对应的控制器了。
这个命令产生了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)可以让我们增加评论。
这个加进去的form是新建一个新的评论,将会调用
CommentsController的create方法。
你会看到这里面的处理会比post控制器的处理稍微复杂一点。这个设置了一个嵌套机制。每个评论都会跟随post。
所以在一开始进行了Post的查找。
同时,代码使用了模型关联的一些方法。我们使用@post.comments的create方法来新建保存评论。
这个将会自动连接comment因为他从属于post。
一旦我们新建完评论,我们将用户回到原来的页面通过post_path(@post)。
正如我们所看到的,他将会调用PostsController的show动作,这时候我们希望
评论显示在此页面上。所以我们修改页面代码。
这样的话,你可以增加博客和评论,他们可以显示在正确的位置。
第二个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 endt.references这行是设定和post模型的外键。
add_index这行是设定这个外键作为索引。
继续向下进行db整合运行
$ rake db:migraterails是足够聪明的,他只运行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)
- [机器学习入门] 李宏毅机器学习笔记-20 (Deep Generative Model-part 3:深度生成模型-part 3)
- Asp.Net MVC4入门指南(4):添加一个模型
- ASP.NET MVC3 快速入门-第六节 增加一个追加数据的方法和一个追加数据的视图(转)
- ASP.NET MVC4入门教程(四):添加一个模型
- ASP.NET MVC3快速入门——第四节、添加一个模型
- Zend Framework 1.10.1 快速入门之四:创建一个模型和数据库表格
- Asp.Net MVC4入门指南(4):添加一个模型
- ASP.NET MVC4 新手入门教程之四 ---4.添加一个模型
- ASP.NET MVC3 快速入门-第七节 在Movie(电影)模型与数据表中添加一个字段(转)
- javascript快速入门之BOM模型—浏览器对象模型(Browser Object Model)
- ASP.NET MVC3 快速入门-第六节 增加一个追加数据的方法和一个追加数据的视图
- 十五.增加一个项目协作留言板功能(一)----- 建立留言板的model
- ASP.NET MVC3快速入门——第四节、添加一个模型
- Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型
- 给电影的模型(Model)和表格增加新的字段(ASP.NET MVC3系列文章七)
- Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型
- Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型
- [机器学习入门] 李宏毅机器学习笔记-18 (Deep Generative Model-part 1:深度生成模型-part 1)
- ASP.NET MVC3 快速入门-第四节 添加一个模型(转)