---
# System prepended metadata

title: Untitled

---

### 如何在註冊/更新user資料時如果增加欄位？

1. 建立一個 migration，在table新增需要的欄位

    ```ruby
    class AddColumnToUsers < ActiveRecord::Migration[6.0]
      def change
        add_column :users, :name, :string
        add_column :users, :birthday, :datetime
      end
    end
    ```

2. rails db:migrate
3. 確認schema.rb裡面已經加入欄位

    ```ruby
    create_table "users", force: :cascade do |t|
        t.string "email", default: "", null: false
        t.string "encrypted_password", default: "", null: false
        t.string "reset_password_token"
        t.datetime "reset_password_sent_at"
        t.datetime "remember_created_at"
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.string "name"
        t.datetime "birthday"
        t.string "confirmation_token"
        t.datetime "confirmed_at"
        t.datetime "confirmation_sent_at"
        t.string "unconfirmed_email"
        t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
        t.index ["email"], name: "index_users_on_email", unique: true
        t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
      end
    ```

4. 參考devise官網的指示，讓新欄位的parameters允許通過[https://github.com/heartcombo/devise#strong-parameters](https://github.com/heartcombo/devise#strong-parameters)

```jsx
def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
 end
```

5.  最後回到頁面將新增欄位show出來

### 如何寄發Email

1. 新增migration，加入devise提供的confirmable相關欄位及index

### 如何略過編輯user資料時，必須提供密碼的步驟？

[https://github.com/heartcombo/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password](https://github.com/heartcombo/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password)

1. 因為devise預設都是吃Devise controller(如Devise::RegistrationsController)，所以如果要更改設定，必須先建立另一個controller蓋過原始設定。

    ```ruby
    $ rails generate devise:controllers [scope]
    #這邊的scope我使用users
    ```

    devise會幫你建立八個controller，如果不想那麼多，可以用以下指令替代

    ```ruby
    $ rails generate devise:controllers users -c=sessions
    #只建立sessions這個controller
    ```

2. 到routes.rb這邊放入這段code，告訴router使用我們建立的controller

    ```ruby
    devise_for :users, controllers: { registrations: 'registrations' }
    # 其他controller如需要也可比照辦理
    ```

3. 在registration.controller底下，放入這段code

    ```ruby
    def update_resource(resource, params)
        resource.update_without_password(params)
    end
    ```

4. 在application_controller.rb裡面，放入這段code，讓我們新建的欄位，可以被params抓到並傳送

    ```ruby
    def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
        devise_parameter_sanitizer.permit(:account_update, keys: [:name])
      end
    ```

如此一來，就可以在不需要輸入密碼的情況下更改資料。

### 如何查devise原始的code？

1. 在終端機輸入gem env，可以查到我們存放gem的路徑

    ```ruby
    > gem env
    RubyGems Environment:
      - RUBYGEMS VERSION: 3.2.1
      - RUBY VERSION: 2.7.0 (2019-12-25 patchlevel 0) [x86_64-darwin19]
      - INSTALLATION DIRECTORY: /Users/phil/.rvm/gems/ruby-2.7.0
    ```

2. 用編輯器打開這個資料夾，就可以查看所有devise的code。