--- title: 12th 鐵人賽 Day_11 erb? form helper? strong parameter? tags: 12th 鐵人賽 --- 嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece: ![](https://i.imgur.com/Bl7orCT.jpg) (應同伴要求,放出可愛的功夫海牛!!) 昨天只有放我的程式碼,沒有寫問題,看到標題就會知道,今天一次來問三個! 電梯門: [TOC] ## erb file ? 就目前為止,我知道ruby的檔案檔名為`.rb`,若要將 ruby 語法放到html裡,必須創建一個`.html.erb`的為副檔名的檔案,(學到這裡時候驚呆了,副檔名後面居然還可以再接副檔名 =口=")。 到底什麼是erb呢???先有請wiki大大,出來講句話: >eRuby (Embedded Ruby) is a templating system that embeds Ruby into a text document. >不負責任翻譯: eRuby(嵌入式Ruby)是一個將Ruby嵌入到純文字文件中的templating system。它通常用於將Ruby代碼嵌入HTML文檔中。 [完整版請點我](https://en.wikipedia.org/wiki/ERuby#erb) 而 erb 是 eRuby 的實現方式,前者為純 ruby 所撰寫,且包含在 ruby 的標準函式庫裡;而後者是用C語言寫的。 允許可以使用`<%= %>`,可以將 ruby 語法放入其中,便能動態的去操作、維護我們的HTML畫面。 其中嵌入語法有些些微的差異,稍微提一下: 1. `<% ruby code %>` : 會執行,但不會在畫面上印出 2. `<%= ruby code %>` :執行且印出在畫面上 3. `<%# ruby code %>` : erb註解的寫法 4. `<% ruby code -%>` : -%> 後面若是換行符號則刪除 ## form_helper ? 先看這個普通的頁面 ![](https://i.imgur.com/I9dqV3r.png) 一開始學網頁的時候,就會想,啊!這就是兩個input吧! ![](https://i.imgur.com/edTt3jl.png) 寫完了之後測試,登入按下去,結果發現... ![](https://i.imgur.com/cd8JfPN.png) WHAAAAT?! 這個`ActionController::InvalidAuthenticityToken`問題是為了確定這個提交表單的動作確定是由網站內所提交的,若單純的使用HTML標籤,要再多設計一個input,裡面放著站內的token,與表單一起提交出去,以免有心人士對你利用其他方式,打資料到你的資料庫。 ```htmlmixed= <input name="authenticity_token" value="<%= form_authenticity_token %>" type="hidden"> ``` 不過,Rails 已經幫我們寫好超~好用的helper(可以在view或model中呼叫的方法) 了!!!用`form_helper`製作出的表單已經幫你長好這個hidden的input: ![](https://i.imgur.com/9PGE0AV.png) 以下就來簡單介紹一下常用的三種`form_helper` 先來說一下在rails 5.1 版本之前的,分別為: ### `form_tag` 主要用在沒有model的時候,要指定表單送去的地方,可以直接給他url,也可以用指定controller、action的方式 ```htmlmixed= <% form_tag("/search", method: "get") do %> <!-- form content --> <% end %> <!-- =======or======== --> <% form_tag(controller: "people", action: "search", method: "get", class: "nifty_form") do %> <!-- form content --> <% end %> ``` ### `form_for` 用在有model的時候,先在controller指定一個變數。 ```ruby= # app/controllers/articles_controller.rb def new @article = Article.new end ``` ```htmlmixed= # app/views/articles/new.html.erb <%= form_for @article, url: {action: "create"}, html: {class: "nifty_form"} do |f| %> <%= f.text_field :title %> <%= f.text_area :body, size: "60x12" %> <%= f.submit "Create" %> <% end %> ``` :::success url 的部分可以改寫成 path 的方式,看 routes 提供什麼路徑給你 ::: ```htmlmixed= <%= form_for @article, articele_path, methods: "POST" , html: {class: "nifty_form"} do |f| %> <!-- create 路徑的方式預設是用post方式將資料送過去的,所以加上 methods: "POST" --> <!-- .... --> <% end %> ``` ### `form_with` Rails 5.1 版後出來的,基本上就是懶人寫法了,不再分成`form_tag`、`form_for`,取決於你傳什麼進去。 ```htmlmixed= <!-- url 的寫法 --> <%= form_with(url: "/search", method: "get") do %> <%= label_tag(:q, "Search for:") %> <%= text_field_tag(:q) %> <%= submit_tag("Search") %> <% end %> ``` ```htmlmixed= <!-- model的寫法 --> <%= form_with model: @article, class: "nifty_form" do |f| %> <%= f.text_field :title %> <%= f.text_area :body, size: "60x12" %> <%= f.submit "Create" %> <% end %> ``` :::danger §§ 特別注意,使用form_with做出來的表單預設是用ajax的方式送出,也就是不跳頁,只會送出新的請求,用得好的話,會有很好的使用者的體驗(畢竟不換頁,速度感覺起來就比較快),不過用不好的話可能會發生使用者送出表單,畫面卻沒有動靜(畢竟不換頁嘛)。 §§ 若不想要使用ajax的方式送出表單,可以在 `form with` 多增加一行 `local: true` ,這樣就會用瀏覽器本身的表單提交方式。 §§ 一般而言,ajax 通常會搭配個 js 檔案去將畫面做變更,這樣才能讓使用者知道說資料已經寫好了。 ::: 至於 form content 的部分有很多可以設定,有空可以翻一些[官方文件](https://guides.rubyonrails.org/form_helpers.html#other-helpers-of-interest) ## strong parameter? 昨天有提到當我們試圖將一大包資料,直接寫進資料庫裡們會出現一個`ActiveModel::ForbiddenAttributesError` 錯誤訊息,以前的rails 是利用在 model裡設置白名單來允許可以存入資料庫的欄位。而Rails 4 之後提供了一種稱之 Strong Parameters 的做法,將過濾這件事丟給了controller,可以使用 permit 方法,來決定要寫入資料裡的欄位。 ```ruby= def admin_params params.require(:admin).permit(:account, :password) end ``` 以上,就是今天的三個問題啦,感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見! ![](https://i.imgur.com/PPbpd2b.gif)