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 ...
随机推荐
- 抱SQL SERVER大腿之我爱用视图(对大数据量的管理)
我们拥有一个巨大的表,两千多万条记录.也许在行家眼里,两千多万条记录顶多算条毛,不过这条毛也忒粗壮了一点:我们的数据库占用的空间已经达到5G多了.不要以为是日志文件在搞鬼,日志文件可以自动收缩的,最多 ...
- 【转】Swig使用指南
如何使用 API swig.init({ allowErrors: false, autoescape: true, cache: true, encoding: 'utf8', filters: { ...
- On extracting ops from LLVM backend
Symbols and ops generation: llvm::Function* BackendLLVM::build_llvm_instance (bool groupentry) Work ...
- keepalive 原理讲解
keepalive 我们说到keepalive的时候,需要先明确一点,这个keepalive说的是tcp的还是http的. tcp的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送 ...
- flask源码解析之session
内容回顾 cookie与session的区别: 1. session 是保存在服务端的键值对 2. cookie 只能保存4096个字节的数据,但是session不受限制 3. cookie保存在浏览 ...
- 这几天bug多,自我检讨一下
这段时间(主要指4月底到5月初)写的bug超过以往总和,觉得很有必要停一下,找找原因.所谓前车之鉴后车之师,不能也不应该在同一地方跌倒N次吧: 为什么bug频出? 深究原因,并不是代码量大.功能多,反 ...
- WKWebView 里 JS 和 native 通信的例子
native 端 初始化 wkwebview,设置 message handler webView = WKWebView.init() let usecc = self.webView.config ...
- Android Ble4.0开发
最近在做一个蓝牙的项目,是Blu4.0,Android系统支持是4.3版本以上(为此特地卖了个手机,). 当然也参考了不少大牛的的微博,说的都不错,再次特地感谢 http://blog.csdn.ne ...
- OAuth 2.0 - Authorization Code授权方式详解
I:OAuth 2.0 开发前期准备 天上不会自然掉馅饼让你轻松地去访问到人家资源服务器里面的用户数据资源,所以你需要做的前期开发准备工作就是把AppKey, AppSecret取到手 新浪获取传送门 ...
- 微信小程序开发笔记2,底部导航栏tablebar
底部导航(要在app.js里面配置,也就是把导航的代码写到app.js) 官方文档说最少2个导航最多5个 , "tabBar": { "color": &quo ...