文档章节

Rails + Bootstrap个人博客搭建的完整过程(4)

BluesChow
 BluesChow
发布于 2015/01/19 16:44
字数 1715
阅读 228
收藏 0

Part 10

接上文,接下来需要做的工作就是网站的安全性。

-字段的有效性设置。这里主要是validates关键字的使用。

如果在目前的网站中,新建文章时,如果不输入文件的标题和内容,却依然可以插入一条数据到数据库,这显然是不对的。根据我目前的要求,文章的标题和内容都是不允许为空的,所以需要在article.rb中加入一行:

validates :title, :content, presence: true

这样如果这2个字段没有被赋过值,这篇文章是不会被插入的。但是发现,在此时插入失败,浏览器没有给出任何提示就直接回到了文章列表页面,给人发布成功的错觉,所以接下来添加一些提示。

1.如果插入失败,依然留在创建页面,即new.html.erb页面。修改articles_controller中的create方法为:

def create
	@article = Article.new(article_params)
	if @article.save
		redirect_to articles_url 
	else
		redirect_to new_article_url
	end
end

2.在new.html.erb页面给出插入失败的提示:

准备开工时发现这个页面里面多了一行

<%= render "./welcome/comment" %>

觉得奇怪,这是新建article,怎么可能会出现comment呢,这应该是我们之前遗留的忘了删掉了,只应该在show和edit中有才对,好的,删除它。

当我们需要知道插入数据的错误时,我们一定需要知道是哪个对象的数据插入错误,即传入到new.html.erb页面的article实例对象,而且必须是插入失败了,不再跳转到别的页面,直接停留在当前页面,但是需要刷新出错误列表以便用户知道该怎么避免输入的错误。所以,在articles_controller中的create方法中的else部分,当插入失败就会执行这里,但是如果只是redirect_to的话,当前的@article对象数据会丢失,必须使用render方法,重新渲染这个页面,所以,它应该改为:

def create
	@article = Article.new(article_params)
	if @article.save
		redirect_to articles_url 
	else
		# redirect_to new_article_url
		render 'new'
	end
end

然后在new.html.erb页面中,如果确实是有错误出现(当然很多时候也没有错误),那么久需要显示错误,暂时就定在在表单的上面显示,显示数据错误的代码:

<div class="form_error">
	<% if @article.errors.any? %>
		<% @article.errors.full_messages.each do |message| %>
			<li><font color=red><%= message %></font></li>
		<% end %>
	<% end %>
</div>

这个div里面的form_error样式如下:

.form_error {
	color: red;
}

只是定义了一下颜色为红色,这样更醒目一些。但是显示的错误信息是Rails给出的,而且是英文,这对于不同国家的用户来说可能不太和谐,所以我们需要定制显示的错误信息。

刚查了下,貌似要定制错误消息,尤其是要把错误里面的字段名改变好像有点麻烦,所以这个问题就留在后面做吧。


-字段的长度限制。在当前的blog项目中,显然一篇文章的标题不能无限长,暂时我就把它限制在50字之内

有了前面的基础,只需在article.rb中添加一行:

validates :title, length: { maximum: 50, message: "长度不能超过50个字符" }

即可。


Part 11

首先说明测试是很重要的,但是我个人不习惯TDD/BDD,所以我并没有遵循大部分教科书的建议。

在Rails领域进行相关测试,主要的方式有2种,一是rails自带的测试框架,二是主流的框架RSpec。

-自带的测试的框架(Reference:http://guides.ruby-china.org/testing.html),先介绍为模型编写单元测试

命令介绍:

使用格式:

rake test test/models/modelname_test.rb

其实就是rake test test_file_path

1.对article模型进行相应的简单单元测试

在test/article_test.rb里面添加一个测试方法,测试article中title字段的存在性,相应的测试代码如下:

test "Should not save article with title" do 
  article = Article.new
  assert_not article.save#, "can add some message help you find the test"
end

对于title没有赋值的article对象,断言它是会保存失败的。如果断言返回值是真,说明title字段是有存在性验证的,如果返回为假,说明title字段没有存在性验证,而根据我们的设想,每个article对象的title必须要存在,所以title的字段的存在性验证是一定要的,所以我们必须保证上述的测试要通过。

经过实验,发现测试的名称和断言错误消息可以使用中文,对于article的content字段的存在性测试如下:

test "article对象的content字段必须存在" do 
  article = Article.new
  article.title = "测试标题"
  assert_not article.save, "article对象要保存必须添加content"
end

如果测试失败(当然目前测试是正确的),那么测试的结果将会输出类似的信息:

Run options: --seed 25449

# Running:

.F

Finished in 0.042496s, 47.0633 runs/s, 47.0633 assertions/s.

  1) Failure:
ArticleTest#test_article对象的content字段必须存在 [/Users/blues/Documents/ror/blog/test/models/article_test.rb:13]:
article对象要保存必须添加content

2 runs, 2 assertions, 1 failures, 0 errors, 0 skips

2.comment模型的测试编写

作为一个与article有对应关系的model,comment的测试理所当然的需要与article产生关系,测试代码如下:

test "Should not save comment without content" do 
  article = Article.new
  article.title = "test article title"
  article.content = "test article content"
  article.save

  comment = article.comments.build(content: "test comment content")
  assert comment.save

end

如果把comment对象仅仅像article一样初始化:

comment = Comment.new

我们断言它一定会失败,但是我运行测试发现:居然断言失败,说明comment的content字段为空时也可以保存成功,这是与我们的想法相悖的,所以我们对于comment对象的验证出了问题,检查代码发现,我根本没有对comment的任何字段做存在性检测,那么就加上吧:

validates :content, presence: true

然后再次运行测试:

rake test test/models/comment_test.rb

通过!

那么看起来一个测试的通过与否是取决于我们的断言(assert)是否正确,这是我们保证我们的代码与我们想要的效果是一致的有效手段,那么出了断言真假外,我们还需要断言一个数据是否是等我们期望的值,字符串是否与我们的期望完全匹配的很多不同种类的断言,为此Rails提供的断言也是多种多样的,具体可以参见:

http://guides.ruby-china.org/testing.html

中的

3.4 可用的断言


3.为控制器编写功能测试

http://guides.ruby-china.org/testing.html的4.1节我还没成功,待续...


接下来的工作就是网站的安全性部分,包括防意外脏数据的插入,字段不为空的检测,格式要求,和最主要的测试部分


© 著作权归作者所有

BluesChow
粉丝 5
博文 163
码字总数 29622
作品 0
深圳
程序员
私信 提问
Rails + Bootstrap个人博客搭建的完整过程(2)

Part 4 创建一篇属于我们的文章吧!之前我并没有设计好这个简单的项目的结构,我就创建了一个叫blog的controller,现在发现我并不需要这个,我目前仅需要一个article的model,和一个欢迎的界...

BluesChow
2015/01/09
0
0
Rails + Bootstrap个人博客搭建的完整过程(1)

Part 1 -首先最基本的,创建一个新的的project: rails new blog -然后修改source为https://ruby.taobao.com,加入bootstrap的gem到Gemfile: gem 'twitter-bootstrap-rails' 执行bundle ......

BluesChow
2015/01/09
0
0
辞旧迎新之际, 我给博客换了新装

2015年3月份我用Rails写了第一个比较完整的项目——首个博客系统,现在回过头来看,觉得很多地方都写的比较烂,今年年初的时候我打算重构自己的博客系统,从一开始的想法到完成整件事,经历了...

rina123
2017/12/18
0
0
免费的响应式Bootstrap模板 - Codester

日期:2013-3-3 来源:GBin1.com 在线演示/下载 Codester是一个基本的个人作品集Bootstrap模板,帮助设计师,摄影师,图形艺术工作者搭建高度可定制的网站。拥有自定义包和相关的javascript,...

gbin1
2013/03/05
36
0
免费的响应式Bootstrap模板 - Codester

日期:2013-3-3 来源:GBin1.com 在线演示/下载 Codester是一个基本的个人作品集Bootstrap模板,帮助设计师,摄影师,图形艺术工作者搭建高度可定制的网站。拥有自定义包和相关的javascript,...

gbin1
2013/03/05
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
14
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部