Part 10 css
接上文,接下来须要作的工做就是网站的安全性。 html
-字段的有效性设置。这里主要是validates关键字的使用。 shell
若是在目前的网站中,新建文章时,若是不输入文件的标题和内容,却依然能够插入一条数据到数据库,这显然是不对的。根据我目前的要求,文章的标题和内容都是不容许为空的,因此须要在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页面给出插入失败的提示: ruby
准备开工时发现这个页面里面多了一行 框架
<%= render "./welcome/comment" %>
以为奇怪,这是新建article,怎么可能会出现comment呢,这应该是咱们以前遗留的忘了删掉了,只应该在show和edit中有才对,好的,删除它。 ide
当咱们须要知道插入数据的错误时,咱们必定须要知道是哪一个对象的数据插入错误,即传入到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给出的,并且是英文,这对于不一样国家的用户来讲可能不太和谐,因此咱们须要定制显示的错误信息。
刚查了下,貌似要定制错误消息,尤为是要把错误里面的字段名改变好像有点麻烦,因此这个问题就留在后面作吧。
有了前面的基础,只需在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节我还没成功,待续...
接下来的工做就是网站的安全性部分,包括防意外脏数据的插入,字段不为空的检测,格式要求,和最主要的测试部分