Rails + Bootstrap我的博客搭建的完整過程(4)

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給出的,並且是英文,這對於不一樣國家的用戶來講可能不太和諧,因此咱們須要定製顯示的錯誤信息。

剛查了下,貌似要定製錯誤消息,尤爲是要把錯誤裏面的字段名改變好像有點麻煩,因此這個問題就留在後面作吧。


-字段的長度限制。在當前的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節我還沒成功,待續...


接下來的工做就是網站的安全性部分,包括防意外髒數據的插入,字段不爲空的檢測,格式要求,和最主要的測試部分

相關文章
相關標籤/搜索