之前在 changeset 不是沒通過檢查會有錯誤訊息嗎?怎麼好像都沒有顯示。
因為我們沒有加,在前兩篇這邊刻意忽略錯誤訊息來簡化表格的寫法,我們現在知道表格怎麼行成與送出,
是該加上檢查了,不過在那之前,我們可以先幫我們的 post 增加幾個檢查,而不是只有必填欄位
打開 Post context lib/blog/posts/post.ex
,再 changeset 方法上加上一些限制
def changeset(note, attrs) do
note
|> cast(attrs, [:title, :body])
# 我們用 message 選項幫他加上我們的客制訊息
|> validate_required([:title, :body], message: "這個必填誒")
# 可以用 validate_length 來限制 body 最少要有 50 個字, 並加上客製化訊息
|> validate_length(:body, min: 50, message: "最少要有 %{count} 個字")
# validate_exclusion 可以拿來排除特定的內容
|> validate_exclusion(:title, ["123", "abc"], message: "認真取標題!")
# validate_format 可以用正規表示法來檢查,我們讓他檢查標題裡面要有 `:)`
|> validate_format(:title, ~r/\:\)/, message: "標題裡面要有:)")
end
好了之後在表格 lib/blog_web/templates/post/edit.html.heex
的每一個項目下面或是要顯示錯誤訊息的地方加上 error_tag
<h1>編輯文章</h1>
<.form let={f} for={@changeset} action={Routes.post_path(@conn, :update, @post)}>
<%= label(f, :title) %>
<%= text_input(f, :title) %>
<%= error_tag(f, :title) %>
<%= label(f, :body) %>
<%= textarea(f, :body) %>
<%= error_tag(f, :body) %>
<div>
<%= submit("送出") %>
</div>
</.form>
這邊要注意的是 error_tag 不再 phoenix 文件裡面,因為大部分的專案錯誤訊息都不一樣,所以他是產生在
lib/blog_web/views/error_helpers.ex
的這個 ErrorHelpers 裡面,如果需要的話可以進去修改。
我們打開瀏覽器來編輯,故意填入錯誤的訊息按送出
因為資料送到 controller 的 update 方法,且儲存時檢查驗證沒過重新顯示 edit 頁面,
error_tag 就會把 changeset 裡面的 errors 顯示在畫面上,
這樣就完成了錯誤提示及檢查