# 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`並執行後會出現以下畫面:

### 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`並執行後會出現以下畫面:

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