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 ...
随机推荐
- Firemonkey里触发home按键被按下的事件
吾八哥我最近在使用Delphi里的Firemonkey平台写一个叫“由由密码管家”的APP工具,是跨多平台的,如ios/android/windows/macOs.由于是用于密码管理的,那么在手机里操 ...
- LeetCode143:Reorder List
题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must d ...
- MySql数据库远程连接失败问题解决
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话. GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY ...
- C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它
最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它. 这是因为在多线程程序中,新创建 ...
- OpenStack 数据库操作 demo
#!/usr/bin/env python from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine f ...
- 程序媛计划——SQLite初级
数据库简介 数据库定义: 指的是以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度.与应用程序彼此独立的数据集合.是带有相关数据的表的集合. 数据库是由行和列组成的二维表. 字段: 数据库表 ...
- 847. Shortest Path Visiting All Nodes
An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...
- MySQL(视图、触发器、函数)
day61 参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html 视图 视图:给某个查询语句设置别名,日后方便使用 ...
- Educational Codeforces Round 25 B. Five-In-a-Row
题目链接:http://codeforces.com/contest/825/problem/B B. Five-In-a-Row time limit per test 1 second memor ...
- java实现fp-growth算法
本文参考韩家炜<数据挖掘-概念与技术>一书第六章,前提条件要理解 apriori算法. 另外一篇写得较好的文章在此推荐: http://hi.baidu.com/nefzpohtpndho ...