---
# System prepended metadata

title: Rails_devise基本使用教學
tags: [ruby, rails]

---

# Rails_devise基本使用教學

###### tags: `rails`, `ruby`
環境:
> ruby 2.6.7
> 
> Rails 6.1.3.1
> 
> Ubuntu 20.04 LTS

資源連結:
[**官方網站**](https://github.com/heartcombo/devise)

## :memo:

### Step 1: 移至專案裡的Gemfile安裝devise
[**ruby_gem_devise**](https://rubygems.org/gems/devise/versions/4.2.0?locale=zh-TW)
```ruby=
# 專案路徑/Rails_app/Gemfile
gem 'devise', '~> 4.2'

# 移動至Ubuntu使用gem導入至專案, 並安裝devise
$ bundle

$ rails generate devise:install
# 
```
輸入完`rails generate devise:install`並執行後會出現以下畫面：

![](https://i.imgur.com/PjfkPob.jpg)

### Step 2: Rails專案,建立devise_model

```ruby=
# 移動至Ubuntu,建立MODEL,
$ rails g devise User # (自訂名(MODEL))

$ rails db:migrate
```

### Step 3: 客制化登入頁面(view)

```ruby=
# 移動至Ubuntu
$ rails generate devise:views
```
輸入完`bundle`並執行後會出現以下畫面：

![](https://i.imgur.com/rrG5vmZ.jpg)


### Step 4.1: 為devise新增欄位

```ruby=
# 移動至Ubuntu
$ rails g migration add_columns_to_users username:uniq intro:text
```
移動至/appname/db/migrate再確認:

```ruby=
# /appname/db/migrate/20210503065200_add_columns_to_users.rb

class AddColumnsToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :username, :string
    add_index :users, :username, unique: true
    add_column :users, :intro, :text
  end
end
```
```ruby=
# 移動至Ubuntu
$ rails db:migrate
```
### Step 4.2: 建立devise controllers

```ruby=
# 移動至Ubuntu
$ rails g devise:controllers (自訂名)users
```
:::info
:bulb: **Hint:** 
會在 **/appname/app/controllers/users** 生成相關controllers檔案
:::
**移動至routes.rb增加準備要客制化controllers的檔案讓dvise讀取**
```ruby=
# /appname/config/routes.rb

devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
```
**移動至registrations_controller.rb增加剛剛新增的欄位**

```ruby=
# 路徑:/appname/app/controllers/users/registrations_controller.rb

before_action :configure_account_update_params, only: [:update]

private
 def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:username, :intro])
 end
```


### Step 5: 常用指令(helpers)
:::info
:bulb: **Hint:** 
再生成MODEL時,下面會以(自訂名)變動。
例如: `rails g devise User`來生成的話、則下方都會以<font color="red">**_user**</font>開頭。
:::
```ruby=
# 檢測使用者是否登入
user_signed_in?

# 目前登入中的使用者
current_user

# 在此頁面(controller),需要先登入
before_action :authenticate_user!
```