diff --git a/app/controllers/password_resets_controller.rb b/app/controllers/password_resets_controller.rb new file mode 100644 index 0000000..7dc3455 --- /dev/null +++ b/app/controllers/password_resets_controller.rb @@ -0,0 +1,20 @@ +class PasswordResetsController < ApplicationController + def new + end + + def create + @user = User.find_by(emial: params[:password_reset][:email].downcase) + if @user + @user.create_reset_digest + @user.send_password_reset_email + flash[:info] = "Email send with password reset instructions" + redirect_to root_url + else + flash.now[:danger] = "Email not found" + render 'new' + end + end + + def edit + end +end diff --git a/app/helpers/password_resets_helper.rb b/app/helpers/password_resets_helper.rb new file mode 100644 index 0000000..0c9d96e --- /dev/null +++ b/app/helpers/password_resets_helper.rb @@ -0,0 +1,2 @@ +module PasswordResetsHelper +end diff --git a/app/views/password_resets/edit.html.erb b/app/views/password_resets/edit.html.erb new file mode 100644 index 0000000..2d1800e --- /dev/null +++ b/app/views/password_resets/edit.html.erb @@ -0,0 +1,2 @@ +

PasswordResets#edit

+

Find me in app/views/password_resets/edit.html.erb

diff --git a/app/views/password_resets/new.html.erb b/app/views/password_resets/new.html.erb new file mode 100644 index 0000000..f9debf8 --- /dev/null +++ b/app/views/password_resets/new.html.erb @@ -0,0 +1,14 @@ +<% provide(:title, "Forget password") %> +

Forget password

+ +
+
+ <%= form_with(url: password_resets_path, scope: password_reset, + local: true) do |f| %> + <%= f.label :email %> + <%= f.email_field :email, class: "form-control" %> + + <%= f.submit "Submit", class: "btn btn-primary" %> + <% end %> +
+
diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index bd4fe03..fbe815b 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -8,6 +8,7 @@ <%= f.email_field :email, class: 'form-control' %> <%= f.label :password %> + <%= link_to "(forgot password)", new_password_reset_path %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :remember_me, class: "checkbox inline" do %> diff --git a/config/routes.rb b/config/routes.rb index 637018d..a3af422 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Rails.application.routes.draw do + get "password_resets/new" + get "password_resets/edit" # get "sessions/new" # get "users/new" # get "static_pages/home" @@ -19,6 +21,7 @@ Rails.application.routes.draw do resources :users resources :account_activations, only: [ :edit ] + resources :password_resets, only: [ :new, :create, :edit, :update ] # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html diff --git a/db/migrate/20250107093124_add_reset_to_users.rb b/db/migrate/20250107093124_add_reset_to_users.rb new file mode 100644 index 0000000..2eb292e --- /dev/null +++ b/db/migrate/20250107093124_add_reset_to_users.rb @@ -0,0 +1,6 @@ +class AddResetToUsers < ActiveRecord::Migration[8.0] + def change + add_column :users, :reset_digest, :string + add_column :users, :reset_send_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 991e966..88fd542 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_01_06_091017) do +ActiveRecord::Schema[8.0].define(version: 2025_01_07_093124) do create_table "users", force: :cascade do |t| t.string "name" t.string "email" @@ -22,6 +22,8 @@ ActiveRecord::Schema[8.0].define(version: 2025_01_06_091017) do t.string "activation_digest" t.boolean "activated", default: false t.datetime "activated_at" + t.string "reset_digest" + t.datetime "reset_send_at" t.index ["email"], name: "index_users_on_email", unique: true end end