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節我還沒成功,待續...
接下來的工做就是網站的安全性部分,包括防意外髒數據的插入,字段不爲空的檢測,格式要求,和最主要的測試部分