---
# System prepended metadata

title: 20220803 Rails 無名小站實作 (Rich) 會員系統
tags: [Rails, Ruby]

---

# 20220803 Rails 無名小站實作 (Rich) 會員系統
###### tags: `Ruby` `Rails`

Binary Search
對半切，猜幾次可以猜中數字

公式:　2**n > 數值

 $$最多需要嘗試Ceil(log_2n)次$$

記憶體位址
> 陣列在電腦裡是連續的記憶體位置

電影院

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


資料結構
* stack
* queue
* linked list

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


## 會員系統

### 路徑設計

語意清楚，加入分類避免日後有其他項目也會使用到同樣動詞
/users/register
/users/sign_up


路徑改 resource 可以去除id相關的路徑

之所以會員系統不使用id的原因:
如果今天有人手手賤直接去給網址的id，那就會看到別的會員的東西
另外就是，當我註冊完會員後，假設我的id是123，那這樣不就知道會員人數至少會有123人。
所以設計會員系統時，盡量不要有id的路徑。

### form_with
`form_for` 和 `form_tag` 的合體
form_with(model: @user) = form_for @user
form_with(url: "/") = form_tag (url: "/") 


> resource 接單數的問題
https://rails.ruby.tw/routing.html#%E5%96%AE%E6%95%B8%E8%B3%87%E6%BA%90:~:text=%E6%9C%89%E4%B8%80%E5%80%8B%E5%AD%98%E5%9C%A8%E5%B7%B2%E4%B9%85%E7%9A%84%20Bug%20%E5%B0%8E%E8%87%B4%20form_for%20%E7%84%A1%E6%B3%95%E8%87%AA%E5%8B%95%E8%99%95%E7%90%86%E5%A5%BD%E5%96%AE%E6%95%B8%E8%B3%87%E6%BA%90%E3%80%82%E8%A7%A3%E6%B1%BA%E8%BE%A6%E6%B3%95%E6%98%AF%E7%B5%A6%E8%A1%A8%E5%96%AE%E6%98%8E%E7%A2%BA%E6%8C%87%E5%AE%9A%20URL%EF%BC%9A


> confirmation
https://rails.ruby.tw/active_record_validations.html#confirmation

> uniqueness
https://rails.ruby.tw/active_record_validations.html#uniqueness

### I18n

= **I**nternationalizatio**n**

### 密碼

:x: 取得原本密碼
:heavy_check_mark: 變更密碼

* 標準函式庫 引入digest 可以幫密碼加密
```ruby=
require 'digest'
pw = '123456'

p Digest::SHA1.hexdigest(pw)

pw = '123457'

p Digest::SHA1.hexdigest(pw)
```

```ruby=
def encrypt_password
  self.password = Digest::SHA1.hexdigest(self.password)
end
```

:warning: 上面方法仍不安全
> solution
[加鹽 (Salting) at wiki](https://zh.wikipedia.org/zh-tw/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6))
[聽說不能用明文存密碼，那到底該怎麼存？](https://medium.com/starbugs/how-to-store-password-in-database-sefely-6b20f48def92)

```ruby=
def salting(txt)
  #...
end

p salting("123456")  # 1a2b3z4x5y6k"
```


### [Active Record Callback](https://rails.ruby.tw/active_record_callbacks.html)

![](https://railsbook.tw/images/chapter19/model-lifecycle.png)

#### 在帳號建立時記錄加密過的密碼(=密碼的雜湊值)

```ruby=
before_create :encrypt_password

private

def salting(txt)
  #...
end

def encrypt_password
  self.password = Digest::SHA1.hexdigest(self.password)
end
```


### 登入

檢查 client 的 cookie 跟 server 上的 session 是否符合

POST /sessions/   sessions#create

### 補充資料

1. https://ithelp.ithome.com.tw/articles/10246787
![](https://i.imgur.com/0QcTbOA.png)

1. [淺談 Session 與 Cookie：一起來讀 RFC](https://blog.techbridge.cc/2019/08/10/session-and-cookie-rfc/)