iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Modern Web

速成 Phoenix, 2022年最受喜愛框架系列 第 17

{17, Phoenix, "顯示表格錯誤與通知"}

  • 分享至 

  • xImage
  •  

顯示表格錯誤與通知

之前在 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 裡面,如果需要的話可以進去修改。

我們打開瀏覽器來編輯,故意填入錯誤的訊息按送出

https://ithelp.ithome.com.tw/upload/images/20220921/20141054AFsAppdBzi.png

因為資料送到 controller 的 update 方法,且儲存時檢查驗證沒過重新顯示 edit 頁面,
error_tag 就會把 changeset 裡面的 errors 顯示在畫面上,
這樣就完成了錯誤提示及檢查


上一篇
{16, Phoenix, "接收送出的表格"}
下一篇
{18, Phoenix, "新增"}
系列文
速成 Phoenix, 2022年最受喜愛框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言