---
# System prepended metadata

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

---

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

費式數列(遞迴)
1,1,2,3,5,8,13,21...
```ruby=
def fib(n)
	return n if n <= 1
	return fib(n-1) + fib(n-2)
end

fib(5)
```



## 首頁加上導覽頁
登入、註冊
```htmlmixed=
    <nav>
      <ul>
        <li> <%= link_to "登入", sign_in_users_path %></li>
        <li> <%= link_to "註冊", sign_up_users_path %></li>
        <% if user_signed_in? %>
          <li><%= current_user.email %></li>
        <% end %>
      </ul>
    </nav>
```

### session

...

## User helper
```ruby=
module UsersHelper
  def current_user
    User.find_by(id: session[:user_session])
  end

  def user_signed_in?
    #true/false，邏輯短路，前面沒有就不用看後面的資料庫
    session[:user_session] && current_user
  end
end
```
...
如果`helper`同名，按英文字母順序後面會蓋掉前面

### 把 View 複雜的東西放在 helper

...

## Ruby 類別 (補充)


實體.class 印出 實體的類別

類別.class 印出 Class

superclass 印出上層的類別

ancestors 印出本身的類別，及上層所有的類別、模組

類別與模組 : 類別可以繼承、可以產生實體；模組不行

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



關鍵字 => ruby object model


include  會生出實體方法 
extend   直接擴充類別，會生出類別方法

singleton method 任何物件上都可以直接定義專屬方法
類別上的singleton method => self.method
```ruby=
class Cat
	def self.fly
	end
end

Cat.fly
```

### 登入認證與授權
Authentication 認證
登入拿到認證，可以看別人的東西，但不能編輯別人的東西

Authorization  授權
擁有可以編輯的授權


devise 套件 = >製作會員登入系統


* Memorization
```ruby=
  def current_user
    # 只撈一次，第二次在看到就給之前撈過的； memorization 記憶
    # @_user = @_user || User.find_by(id: session[:user_session])
    @_user || = User.find_by(id: session[:user_session])
  end
```
### 登出

session controller 清空session改成nil
```ruby=
  def destroy
    session[:user_session] = nil
    redirect_to "/", notice: "已登出"
  end
```

## 關聯


* 1:1
* 1:N
* N:N

```ruby=
class AddUserIdToArticle < ActiveRecord::Migration[6.1]
  def change
    # add_column :articles, :user_id, :integer
    add_reference :articles, :user
    # add_belongs_to :articles, :user
  end
end


# in schema.rb
t.index ["user_id"], name: "index_articles_on_user_id"
```

### 索引

網站 讀取次數 > 寫入次數

所以 建索引 


### Model增加方法

```ruby=
# app/models/user.rb
class User < ApplicationRecord
  # relationships
  has_many :articles
  #...
end

# app/models/article.rb
class Article < ApplicationRecord
  # relationships
  belongs_to :user
  #...
end
```



## 認證與授權

* Authentication 認證
* Authorization 授權





