---
# System prepended metadata

title: 20221118 Rails Model關聯
tags: [Ruby & Rails]

---

# 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`

* 可以單獨存在，有查詢需求才需要添加。


---
