---
# System prepended metadata

title: 20221115 Rails
tags: [Ruby & Rails]

---

# 20221115 Rails
###### tags: `Ruby & Rails`
<政庭>
## 瀏覽器有暫存的問題
* 所以對於瀏覽器 靜態網站 的打開時會卡很久
* 早期使用queryString，會讓瀏覽器以為有新的檔案，這樣就瀏覽器不會有暫存。

## script 標籤 網址列有一串亂碼
* 透過打包工具，可以讓瀏覽器對於靜態網站script標籤來解讀
* 如果發現你有改過內容，亂碼變了表示你的頁面是不同的，瀏覽器就會給你新的頁面
* 如果亂碼沒變，表示你的頁面沒有更改過，就給你一樣的頁面

## 路徑 Routes


## 如果表單使用 get 方式傳遞資料且欄位有設定 name
* 你的欄位資料會變成 queryString 呈現在網址上面
* id 是給前端用
* 後端是要看name

## Stong Parameters(強參數)
* 經過清洗的參數
* 可以預防有使用者在輸入資料的時候偷加料

## flash[:notice] flash["alert"]
* 頁面跳轉時跳出的提醒語句
```ruby
flash[:notice] = "成功"
flash[:alert] = "失敗"
```

## SSR = Server Side Rendering

## SPA = Single Page Application

## form_for / form_tag /
* form_tag：沒有model
* form_for：有model

這裡是自己動手刻的 <new_hope.html.erb>
```ruby
<form action="/new_wish_box" method="post">
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
    <input type="text" name="wish_list[title]">
    <textarea name="wish_list[description]"></textarea>
    <button>送出</button>
</form>
```







－－－－
<侑庭>

## 瀏覽器暫存
* style.css?t= 312312312
* style.css?t= 312312313
* style.css?t= 312312314

* 早期透過這方式讓瀏覽器以為是新的檔案,這樣瀏覽器就不會留下暫存檔
* 問號= queryString 


## 要做功能前要先想路徑routes
* 先想路徑有沒有 > controller > action > view 
* 在link_to 裡面要找到Prefix簡易路徑可以
* 如果表單欄位用get方式在傳送的話,就會把表單打得內容丟上去網址列但如果是要輸入帳號密碼就會出現在上面, 而且翻網頁歷史紀錄也可以看到,用post 在傳送就不會有這問題
* 表單裡面如果不是用name的話就不會被拋出去,id and class都不會做傳遞,這兩個屬性是給前端用的
* 在更改get 跟post 的時候要記得網頁要重新整理
![](https://i.imgur.com/Gdt6xZA.png)


* 可以用`render html:` 可以在網頁上渲染出東西
* params 會看到html的檔案上如果有一樣的命名[]就會把他抓成一包hash 就可以一包存入

![](https://i.imgur.com/lzzATiJ.png)


* 整包寫進資料庫裡面 ,我們可以在erb黨做一些巧合可以跟欄位的命名一樣,這樣寫進去的時候就不會找不到欄位也可以直接寫進去

```ruby=
 <form action="/collect_wish" method="POST">
    <input type="hidden" name="authenticity_token">
    <input type="text" name="wishlist[title]">
    <textarea name="wishlist[description]"></textarea>
    <input type="submit" value="check">
</form>
```

* params 整包資料要放進去資料庫會被擋下來,因為沒有做過清洗Rails內建 ,但要是分開一個欄位一個一個抓就可以直接寫進去但就會寫非常多行

```ruby=
#一條一條抓進去table欄位裡
wishlist.title = params[:w][:title]
wishlist.description = params[:w][:description]
```

* 透過params.require(:漂浮在空中key).permit(:在上一包hash裡面的hash值) 經過這樣的步驟就可以寫進

```ruby=
params.require(:wish_list).permit(:title , :description)
```

* <%form_for(要放model.new, url: "/路徑") do% |model|> <% end %> form_for 跟link_to一樣都是view helpper 的一種讓我們可以快速產生很多東西就不用自己在刻像 `authenticity_token` 他們都會幫我們做好省下很多時間

* form舊是寫法
```ruby=
<form action="/collect_wish" method="POST">
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
    <input type="text" name="wish_list[title]">
    <textarea name="wish_list[description]"></textarea>
    <input type="submit" value="check">
</form>

```

* 新式寫法
```ruby=
<%= form_for @wish_list , url: collect_wish_path do |f| %>
<div>
    <%= f.label :title%>
    <%= f.text_field :title %>
</div>

<div>
    <%= f.label :description%>
    <%= f.text_area :description %>
</div>

<%= f.submit %>

<% end %>
```


















---
<于婷> 
## JS暫存問題
### 早期
利用查詢字串的方式，每秒換新的數字，告訴瀏覽器這是不同的檔
### 後期
利用打包工具產生代碼，會去判斷，如果內容一樣，代碼不變，會有暫存效果，內容有改則換另一個代碼。

## 沒認證錯誤 Action Controller::InvalidAuthenticity Token

當表單寫入時會擋，為了防止有人亂傳的機制

解法：
```
<input type="hidden" name="authenticity_token">
```
或是推薦以下form_for寫法：
```ruby=
<%= form_for @wish_list, url: "/create_wish" do |f| %>
  <div>
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div>
    <%= f.label :description %>
    <%= f.text_area :description %>
  </div>
  <%= f.submit %>
<% end %>
```

## 沒清洗錯誤 Active Model::ForbiddenAttributesError

當整包資料寫入時會擋，為了防止有人亂傳的機制

解法，清洗動作：
```ruby=
clean_params = params.require(:wish_list).permit(:title, :description)  

@wish_list = WishList.new(clean_params)
```



---
