diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
new file mode 100644
index 0000000..ff96518
--- /dev/null
+++ b/app/controllers/users_controller.rb
@@ -0,0 +1,58 @@
+class UsersController < ApplicationController
+ before_action :set_user, only: %i[ show edit update destroy ]
+
+ # GET /users
+ def index
+ @users = User.all
+ end
+
+ # GET /users/1
+ def show
+ end
+
+ # GET /users/new
+ def new
+ @user = User.new
+ end
+
+ # GET /users/1/edit
+ def edit
+ end
+
+ # POST /users
+ def create
+ @user = User.new(user_params)
+
+ if @user.save
+ redirect_to @user, notice: "User was successfully created."
+ else
+ render :new, status: :unprocessable_entity
+ end
+ end
+
+ # PATCH/PUT /users/1
+ def update
+ if @user.update(user_params)
+ redirect_to @user, notice: "User was successfully updated."
+ else
+ render :edit, status: :unprocessable_entity
+ end
+ end
+
+ # DELETE /users/1
+ def destroy
+ @user.destroy
+ redirect_to users_url, notice: "User was successfully destroyed."
+ end
+
+ private
+ # Use callbacks to share common setup or constraints between actions.
+ def set_user
+ @user = User.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def user_params
+ params.require(:user).permit(:email, :status)
+ end
+end
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
new file mode 100644
index 0000000..2310a24
--- /dev/null
+++ b/app/helpers/users_helper.rb
@@ -0,0 +1,2 @@
+module UsersHelper
+end
diff --git a/app/models/user.rb b/app/models/user.rb
new file mode 100644
index 0000000..379658a
--- /dev/null
+++ b/app/models/user.rb
@@ -0,0 +1,2 @@
+class User < ApplicationRecord
+end
diff --git a/app/views/users/_form.html.erb b/app/views/users/_form.html.erb
new file mode 100644
index 0000000..567caec
--- /dev/null
+++ b/app/views/users/_form.html.erb
@@ -0,0 +1,27 @@
+<%= form_with(model: user) do |form| %>
+ <% if user.errors.any? %>
+
+
<%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:
+
+
+ <% user.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :email, style: "display: block" %>
+ <%= form.text_field :email %>
+
+
+
+ <%= form.label :status, style: "display: block" %>
+ <%= form.number_field :status %>
+
+
+
+ <%= form.submit %>
+
+<% end %>
diff --git a/app/views/users/_user.html.erb b/app/views/users/_user.html.erb
new file mode 100644
index 0000000..e9b0220
--- /dev/null
+++ b/app/views/users/_user.html.erb
@@ -0,0 +1,12 @@
+
+
+ Email:
+ <%= user.email %>
+
+
+
+ Status:
+ <%= user.status %>
+
+
+
diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb
new file mode 100644
index 0000000..9dda632
--- /dev/null
+++ b/app/views/users/edit.html.erb
@@ -0,0 +1,10 @@
+Editing user
+
+<%= render "form", user: @user %>
+
+
+
+
+ <%= link_to "Show this user", @user %> |
+ <%= link_to "Back to users", users_path %>
+
diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb
new file mode 100644
index 0000000..fe4dd5c
--- /dev/null
+++ b/app/views/users/index.html.erb
@@ -0,0 +1,14 @@
+<%= notice %>
+
+Users
+
+
+ <% @users.each do |user| %>
+ <%= render user %>
+
+ <%= link_to "Show this user", user %>
+
+ <% end %>
+
+
+<%= link_to "New user", new_user_path %>
diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb
new file mode 100644
index 0000000..eedbd83
--- /dev/null
+++ b/app/views/users/new.html.erb
@@ -0,0 +1,9 @@
+New user
+
+<%= render "form", user: @user %>
+
+
+
+
+ <%= link_to "Back to users", users_path %>
+
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb
new file mode 100644
index 0000000..673fae2
--- /dev/null
+++ b/app/views/users/show.html.erb
@@ -0,0 +1,10 @@
+<%= notice %>
+
+<%= render @user %>
+
+
+ <%= link_to "Edit this user", edit_user_path(@user) %> |
+ <%= link_to "Back to users", users_path %>
+
+ <%= button_to "Destroy this user", @user, method: :delete %>
+
diff --git a/config/routes.rb b/config/routes.rb
index 8a3beac..0dd7717 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
Rails.application.routes.draw do
+ resources :users
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
root "users#index"
diff --git a/db/migrate/20230309185340_create_users.rb b/db/migrate/20230309185340_create_users.rb
new file mode 100644
index 0000000..1efb52e
--- /dev/null
+++ b/db/migrate/20230309185340_create_users.rb
@@ -0,0 +1,11 @@
+class CreateUsers < ActiveRecord::Migration[7.0]
+ def change
+ create_table :users do |t|
+ t.string :email, null: false, limit: 64
+ t.integer :status, null: false, default: 0
+
+ t.timestamps null: false
+ end
+ add_index :users, :email, unique: true
+ end
+end
diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb
new file mode 100644
index 0000000..bda70d8
--- /dev/null
+++ b/test/controllers/users_controller_test.rb
@@ -0,0 +1,48 @@
+require "test_helper"
+
+class UsersControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ @user = users(:one)
+ end
+
+ test "should get index" do
+ get users_url
+ assert_response :success
+ end
+
+ test "should get new" do
+ get new_user_url
+ assert_response :success
+ end
+
+ test "should create user" do
+ assert_difference("User.count") do
+ post users_url, params: { user: { email: @user.email, status: @user.status } }
+ end
+
+ assert_redirected_to user_url(User.last)
+ end
+
+ test "should show user" do
+ get user_url(@user)
+ assert_response :success
+ end
+
+ test "should get edit" do
+ get edit_user_url(@user)
+ assert_response :success
+ end
+
+ test "should update user" do
+ patch user_url(@user), params: { user: { email: @user.email, status: @user.status } }
+ assert_redirected_to user_url(@user)
+ end
+
+ test "should destroy user" do
+ assert_difference("User.count", -1) do
+ delete user_url(@user)
+ end
+
+ assert_redirected_to users_url
+ end
+end
diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml
new file mode 100644
index 0000000..1a2a93c
--- /dev/null
+++ b/test/fixtures/users.yml
@@ -0,0 +1,9 @@
+# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ email: MyString
+ status: 1
+
+two:
+ email: MyString
+ status: 1
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
new file mode 100644
index 0000000..5c07f49
--- /dev/null
+++ b/test/models/user_test.rb
@@ -0,0 +1,7 @@
+require "test_helper"
+
+class UserTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/system/users_test.rb b/test/system/users_test.rb
new file mode 100644
index 0000000..6b39d3f
--- /dev/null
+++ b/test/system/users_test.rb
@@ -0,0 +1,43 @@
+require "application_system_test_case"
+
+class UsersTest < ApplicationSystemTestCase
+ setup do
+ @user = users(:one)
+ end
+
+ test "visiting the index" do
+ visit users_url
+ assert_selector "h1", text: "Users"
+ end
+
+ test "should create user" do
+ visit users_url
+ click_on "New user"
+
+ fill_in "Email", with: @user.email
+ fill_in "Status", with: @user.status
+ click_on "Create User"
+
+ assert_text "User was successfully created"
+ click_on "Back"
+ end
+
+ test "should update User" do
+ visit user_url(@user)
+ click_on "Edit this user", match: :first
+
+ fill_in "Email", with: @user.email
+ fill_in "Status", with: @user.status
+ click_on "Update User"
+
+ assert_text "User was successfully updated"
+ click_on "Back"
+ end
+
+ test "should destroy User" do
+ visit user_url(@user)
+ click_on "Destroy this user", match: :first
+
+ assert_text "User was successfully destroyed"
+ end
+end