### 如何在註冊/更新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。