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