diff --git a/app/assets/tailwind/application.css b/app/assets/tailwind/application.css
index 3116798..da0fac2 100644
--- a/app/assets/tailwind/application.css
+++ b/app/assets/tailwind/application.css
@@ -3,4 +3,19 @@
h1 { @apply font-bold text-2xl; }
h2 { @apply font-bold text-xl; }
ul { @apply list-inside; }
-li { @apply list-disc; }
\ No newline at end of file
+li { @apply list-disc; }
+
+.btn-new { @apply rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white block font-medium; }
+.btn-show { @apply w-full sm:w-auto text-center rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium; }
+.btn-empty { @apply w-full sm:w-auto text-center mt-2 sm:mt-0 sm:ml-2 rounded-md px-3.5 py-2.5 bg-gray-100 hover:bg-gray-50 inline-block font-medium; }
+.btn-destroy { @apply w-full sm:w-auto rounded-md px-3.5 py-2.5 text-white bg-red-600 hover:bg-red-500 font-medium cursor-pointer; }
+
+.notice p#notice { @apply py-2 px-3 bg-green-50 mb-5 text-green-500 font-medium rounded-md inline-block; }
+
+form input[type="text"],
+form input[type="number"]
+{
+ @apply block shadow-sm rounded-md border px-3 py-2 mt-2 w-full;
+}
+
+form input[type="submit"] { @apply w-full sm:w-auto rounded-md px-3.5 py-2.5 bg-blue-600 hover:bg-blue-500 text-white inline-block font-medium cursor-pointer; }
\ No newline at end of file
diff --git a/app/controllers/friends_controller.rb b/app/controllers/friends_controller.rb
new file mode 100644
index 0000000..eed13f6
--- /dev/null
+++ b/app/controllers/friends_controller.rb
@@ -0,0 +1,56 @@
+class FriendsController < ApplicationController
+ before_action :set_friend, only: %i[ show edit update destroy ]
+
+ def index
+ @friends = Friend.all
+ end
+
+ def show
+ end
+
+ def new
+ @friend = Friend.new
+ end
+
+ def edit
+ end
+
+ def create
+ @friend = Friend.new(friend_params)
+
+ respond_to do |format|
+ if @friend.save
+ format.html { redirect_to friends_path, notice: "Der Freund wurde gespeichert." }
+ else
+ format.html { render :new, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ def update
+ respond_to do |format|
+ if @friend.update(friend_params)
+ format.html { redirect_to friends_path, notice: "Der Freund wurde angepasst.", status: :see_other }
+ else
+ format.html { render :edit, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ def destroy
+ @friend.destroy!
+
+ respond_to do |format|
+ format.html { redirect_to friends_path, notice: "Der Freund wurde gelöscht.", status: :see_other }
+ end
+ end
+
+ private
+ def set_friend
+ @friend = Friend.find(params.expect(:id))
+ end
+
+ def friend_params
+ params.expect(friend: [ :firstname, :lastname, :email, :telefon, :level ])
+ end
+end
diff --git a/app/helpers/friends_helper.rb b/app/helpers/friends_helper.rb
new file mode 100644
index 0000000..0b69e9b
--- /dev/null
+++ b/app/helpers/friends_helper.rb
@@ -0,0 +1,2 @@
+module FriendsHelper
+end
diff --git a/app/models/friend.rb b/app/models/friend.rb
new file mode 100644
index 0000000..01ac1ea
--- /dev/null
+++ b/app/models/friend.rb
@@ -0,0 +1,3 @@
+class Friend < ApplicationRecord
+ validates :firstname, :lastname, :email, :telefon, presence: true
+end
diff --git a/app/views/friends/_form.html.erb b/app/views/friends/_form.html.erb
new file mode 100644
index 0000000..2edfb0c
--- /dev/null
+++ b/app/views/friends/_form.html.erb
@@ -0,0 +1,42 @@
+<%= form_with(model: friend, class: "contents") do |form| %>
+ <% if friend.errors.any? %>
+
+
<%= pluralize(friend.errors.count, "error") %> prohibited this friend from being saved:
+
+
+ <% friend.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :firstname %>
+ <%= form.text_field :firstname, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:firstname].none?, "border-red-400 focus:outline-red-600": friend.errors[:firstname].any?}] %>
+
+
+
+ <%= form.label :lastname %>
+ <%= form.text_field :lastname, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:lastname].none?, "border-red-400 focus:outline-red-600": friend.errors[:lastname].any?}] %>
+
+
+
+ <%= form.label :email %>
+ <%= form.text_field :email, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:email].none?, "border-red-400 focus:outline-red-600": friend.errors[:email].any?}] %>
+
+
+
+ <%= form.label :telefon %>
+ <%= form.text_field :telefon, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:telefon].none?, "border-red-400 focus:outline-red-600": friend.errors[:telefon].any?}] %>
+
+
+
+ <%= form.label :level %>
+ <%= form.number_field :level, class: [{"border-gray-400 focus:outline-blue-600": friend.errors[:level].none?, "border-red-400 focus:outline-red-600": friend.errors[:level].any?}] %>
+
+
+
+ <%= form.submit %>
+
+<% end %>
diff --git a/app/views/friends/_friend.html.erb b/app/views/friends/_friend.html.erb
new file mode 100644
index 0000000..800de22
--- /dev/null
+++ b/app/views/friends/_friend.html.erb
@@ -0,0 +1,22 @@
+
+
+ Firstname:
+ <%= friend.firstname %>
+
+
+ Lastname:
+ <%= friend.lastname %>
+
+
+ Email:
+ <%= friend.email %>
+
+
+ Telefon:
+ <%= friend.telefon %>
+
+
+ Level:
+ <%= friend.level %>
+
+
diff --git a/app/views/friends/edit.html.erb b/app/views/friends/edit.html.erb
new file mode 100644
index 0000000..3a77f61
--- /dev/null
+++ b/app/views/friends/edit.html.erb
@@ -0,0 +1,10 @@
+<% content_for :title, "Editing friend" %>
+
+
+
Freund bearbeiten
+
+ <%= render "form", friend: @friend %>
+
+ <%= link_to "Anzeigen", @friend, class: "btn-show" %>
+ <%= link_to "Liste", friends_path, class: "btn-show" %>
+
diff --git a/app/views/friends/index.html.erb b/app/views/friends/index.html.erb
new file mode 100644
index 0000000..727c9fe
--- /dev/null
+++ b/app/views/friends/index.html.erb
@@ -0,0 +1,29 @@
+<% content_for :title, "Freunde" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Freunde
+ <%= link_to "Neuer Freund", new_friend_path, class: "btn-new" %>
+
+
+
+ <% if @friends.any? %>
+ <% @friends.each do |friend| %>
+
+ <%= render friend %>
+
+ <%= link_to "Anzeigen", friend, class: "btn-show" %>
+ <%= link_to "Bearbeiten", edit_friend_path(friend), class: "btn-show" %>
+ <%= button_to "Löschen", friend, method: :delete, class: "btn-destroy", data: { turbo_confirm: "Sind Sie sich sicher?" } %>
+
+
+ <% end %>
+ <% else %>
+
Bisher kein Freund eingegeben.
+ <% end %>
+
+
diff --git a/app/views/friends/new.html.erb b/app/views/friends/new.html.erb
new file mode 100644
index 0000000..acceb3b
--- /dev/null
+++ b/app/views/friends/new.html.erb
@@ -0,0 +1,7 @@
+<% content_for :title, "Neuer Freund" %>
+
+
+
Neuer Freund
+ <%= render "form", friend: @friend %>
+ <%= link_to "Back to friends", friends_path, class: "btn-empty" %>
+
diff --git a/app/views/friends/show.html.erb b/app/views/friends/show.html.erb
new file mode 100644
index 0000000..e86f93e
--- /dev/null
+++ b/app/views/friends/show.html.erb
@@ -0,0 +1,17 @@
+<% content_for :title, "Freund anzeigen" %>
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
Freund anzeigen
+
+ <%= render @friend %>
+
+ <%= link_to "Bearbeiten", edit_friend_path(@friend), class: "btn-show" %>
+ <%= link_to "Liste anzeigen", friends_path, class: "btn-show" %>
+ <%= button_to "Löschen", @friend, method: :delete, form_class: "sm:inline-block mt-2 sm:mt-0 sm:ml-2",
+ class: "btn-destroy",
+ data: { turbo_confirm: "Are you sure?" } %>
+
diff --git a/config/routes.rb b/config/routes.rb
index 9eee1db..4ca6f6d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -9,5 +9,7 @@ Rails.application.routes.draw do
get "pages/:page" => "welcome#pages", as: :pages
+ resources :friends
+
root "welcome#index"
end
diff --git a/db/migrate/20251119093322_create_friends.rb b/db/migrate/20251119093322_create_friends.rb
new file mode 100644
index 0000000..2961d6b
--- /dev/null
+++ b/db/migrate/20251119093322_create_friends.rb
@@ -0,0 +1,12 @@
+class CreateFriends < ActiveRecord::Migration[8.0]
+ def change
+ create_table :friends do |t|
+ t.string :firstname, null: false
+ t.string :lastname, null: false
+ t.string :email, null: false
+ t.string :telefon, null: false
+ t.integer :level, default: 5
+ t.timestamps
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0f651a4..577f703 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,5 +10,14 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[8.0].define(version: 0) do
+ActiveRecord::Schema[8.0].define(version: 2025_11_19_093322) do
+ create_table "friends", force: :cascade do |t|
+ t.string "firstname", null: false
+ t.string "lastname", null: false
+ t.string "email", null: false
+ t.string "telefon", null: false
+ t.integer "level", default: 5
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
end