# 20221118 Rails Model關聯
###### tags: `Ruby & Rails`
[TOC]
## 會員系統
<政庭>
## 使用user model 來建立關聯性
* resource 單數 user/new 沒有id ==> 前台 / 對應的 controller 路徑是複數
* * 新增
* * 修改
* * 刪除
* resources 複數 users/new/2 有id ==>後台
一般使用者不應該有id
### object life cycle
### 雜湊加密
before_create:只有在create生命週期時它自己獨有
before_update:只有在update生命週期時它自己獨有
## 撒鹽 (salting)
* 增加 密碼複查度,提高安全性
## resource 路徑不夠
* member --> 路徑會有id
* collection --> 路徑不會有id
## 登入跟是否為會員沒有關係
* 另外給一個號碼牌 resource :session
## cookie VS session
* server 拿的是session
* client 拿的是cookie
* 這兩個是一對的,所以確認兩者對的上才算是真正的"登入成功"
## view helper
* 把view helper 寫在 /app/helper資料夾裡面
## 建立關聯性
從 Wishlist ---> User
* 在User.rb ==> has_many: wish_lists
* 在wishl_ist.rb ==> belongs_to :user
* belongs_to 可以單獨存在。
---
<侑庭>
## resources vs resource
* 單複數區別 最大就是路徑複數的有id , 單數的沒有id
```ruby!
resources :users users/2 >show
resource :user users/3
```
* 慣例單數會對單數,複數會對複數
## 按慣例做事情
form_with 跟 form_for 會自動去猜路徑有的時候會猜成複數,這時候我們就要去改routes 要在
hash雜湊演算法 ,MD5 ,SHA1 ,SHA256 輸入跟輸出是一樣,說起來就像是為密碼11111打進來之後 經過MD5加密成abcde就會在資料庫中寫入abcde , 只要使用者打一樣密碼進來就會得到一樣的結果
```ruby!
#hash
private
def encrypt_password
self.password =Digest::SHA256.digest(self.password)
end
```
## cookie vs session
cookie 像是我們買飲料的號碼牌拿在消費者手上
session 像是店家的號碼牌可以比對買飲料的客人
所以我們以前常常清除瀏覽器的cookie 就是可以取消暫存也就是把號碼牌取消,這樣我們去那家店就要重新再排(也就是重新登入一次)
兩種引入方法, 可以在controller 用 include helper 或是如果在放在controller 裡面那view就不會動了 ,我們就可以用 helper_method:後面接參數就可以給他們用了
會員登入系統
diveser
Sorcery
```ruby!
# add_colummn :wish_lists , :user_id , :integer
# add_index :wish_lists ,:user_id
add_belongs_to :wish_lists, :user
# add_references :wish_lists, :user
```
def current_user
@__usreUser__ ||= User.find_by(id: session[:user])
end
has_many :wish_list , 不是建立關聯而是會建立四種方法讓他可以他, 讓他用但是都是抓table裡面的欄位利用他們的id ,belongs_to :user
---
<于婷>
## 當要建立前台路徑
```ruby=
resource :user, as: "users"
```
1. 可使用resource 會缺少id(不會看到別人的), index(不會有所有列表)
2. resource單數 :user也是單數
3. 慣例上會去找users_path但我們是用單數去長,所以要再做給他`as: "users"`
## 為密碼加密
```ruby=
private
def encrypt_password
self.password =Digest::SHA256.digest(self.password)
end
```
## cookie 與 session
1. server伺服器 拿的是session
2. client瀏覽器(使用者) 拿的是cookie
3. 類似點餐時會有取單號碼牌
## 快速製作使用者(包含登入登出)
下載套件
diveser 或 Sorcery
## 建立關聯性
WishList <-> User
1. 在User.rb => `has_many: wish_lists`
2. 在WishLst.rb => `belongs_to :user`
* 可以單獨存在,有查詢需求才需要添加。
---