---
# System prepended metadata

title: 12th 鐵人賽 Day_11 erb? form helper? strong parameter?
tags: [12th 鐵人賽]

---

---
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 的標準函式庫裡；而後者是用Ｃ語言寫的。

允許可以使用`<%= %>`，可以將 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)