From 07ff0f026c55981065bbed55674582cbbfd8570f Mon Sep 17 00:00:00 2001
From: Andrew Canfield
Date: Sun, 9 Jun 2024 10:48:48 -0700
Subject: [PATCH 1/3] Added weight to pets
---
app/controllers/pets_controller.rb | 2 +-
app/views/pets/_form.html.erb | 5 +++++
app/views/pets/_pet.html.erb | 5 +++++
app/views/pets/_pet.json.jbuilder | 2 +-
db/migrate/20240609173229_add_weight_to_pets.rb | 5 +++++
db/schema.rb | 3 ++-
db/seeds.rb | 8 ++++----
test/controllers/pets_controller_test.rb | 4 ++--
test/fixtures/pets.yml | 14 ++++++++------
test/system/pets_test.rb | 2 ++
10 files changed, 35 insertions(+), 15 deletions(-)
create mode 100644 db/migrate/20240609173229_add_weight_to_pets.rb
diff --git a/app/controllers/pets_controller.rb b/app/controllers/pets_controller.rb
index 8db2d0b..fc26672 100644
--- a/app/controllers/pets_controller.rb
+++ b/app/controllers/pets_controller.rb
@@ -65,6 +65,6 @@ def set_pet
# Only allow a list of trusted parameters through.
def pet_params
- params.require(:pet).permit(:name, :kind, :breed)
+ params.require(:pet).permit(:name, :kind, :breed, :weight)
end
end
diff --git a/app/views/pets/_form.html.erb b/app/views/pets/_form.html.erb
index 51e9be1..ec9f2d4 100644
--- a/app/views/pets/_form.html.erb
+++ b/app/views/pets/_form.html.erb
@@ -26,6 +26,11 @@
<%= form.text_field :breed %>
+
+ <%= form.label :weight, style: "display: block" %>
+ <%= form.number_field :weight %>
+
+
<%= form.submit %>
diff --git a/app/views/pets/_pet.html.erb b/app/views/pets/_pet.html.erb
index fcf029f..bcef191 100644
--- a/app/views/pets/_pet.html.erb
+++ b/app/views/pets/_pet.html.erb
@@ -14,4 +14,9 @@
<%= pet.breed %>
+
+ Weight:
+ <%= pet.weight %>
+
+
diff --git a/app/views/pets/_pet.json.jbuilder b/app/views/pets/_pet.json.jbuilder
index 772e3a2..e035ddc 100644
--- a/app/views/pets/_pet.json.jbuilder
+++ b/app/views/pets/_pet.json.jbuilder
@@ -1,2 +1,2 @@
-json.extract! pet, :id, :name, :kind, :breed, :created_at, :updated_at
+json.extract! pet, :id, :name, :kind, :breed, :weight, :created_at, :updated_at
json.url pet_url(pet, format: :json)
diff --git a/db/migrate/20240609173229_add_weight_to_pets.rb b/db/migrate/20240609173229_add_weight_to_pets.rb
new file mode 100644
index 0000000..f18b811
--- /dev/null
+++ b/db/migrate/20240609173229_add_weight_to_pets.rb
@@ -0,0 +1,5 @@
+class AddWeightToPets < ActiveRecord::Migration[7.1]
+ def change
+ add_column :pets, :weight, :decimal, precision: 5, scale: 2, default: nil
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index a65d797..4a93cf0 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,13 +10,14 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.1].define(version: 2024_05_15_193131) do
+ActiveRecord::Schema[7.1].define(version: 2024_06_09_173229) do
create_table "pets", force: :cascade do |t|
t.string "name"
t.string "kind"
t.string "breed"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.decimal "weight", precision: 5, scale: 2
end
end
diff --git a/db/seeds.rb b/db/seeds.rb
index 857ab7b..8d66257 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -8,10 +8,10 @@
# Create pets
Pet.create!(
[
- { name: 'Buddy', kind: 'Dog', breed: 'Golden Retriever' },
- { name: 'Whiskers', kind: 'Cat', breed: 'Siamese' },
- { name: 'Tweety', kind: 'Bird', breed: 'Canary' },
- { name: 'Nemo', kind: 'Fish', breed: 'Clownfish' }
+ { name: 'Buddy', kind: 'Dog', breed: 'Golden Retriever', weight: 60 },
+ { name: 'Whiskers', kind: 'Cat', breed: 'Siamese', weight: 8.5 },
+ { name: 'Tweety', kind: 'Bird', breed: 'Canary', weight: 1 },
+ { name: 'Nemo', kind: 'Fish', breed: 'Clownfish', weight: 0.25 }
]
)
diff --git a/test/controllers/pets_controller_test.rb b/test/controllers/pets_controller_test.rb
index b3a1db2..6e1b09c 100644
--- a/test/controllers/pets_controller_test.rb
+++ b/test/controllers/pets_controller_test.rb
@@ -17,7 +17,7 @@ class PetsControllerTest < ActionDispatch::IntegrationTest
test "should create pet" do
assert_difference("Pet.count") do
- post pets_url, params: { pet: { breed: @pet.breed, kind: @pet.kind, name: @pet.name } }
+ post pets_url, params: { pet: { breed: @pet.breed, kind: @pet.kind, name: @pet.name, weight: @pet.weight } }
end
assert_redirected_to pet_url(Pet.last)
@@ -34,7 +34,7 @@ class PetsControllerTest < ActionDispatch::IntegrationTest
end
test "should update pet" do
- patch pet_url(@pet), params: { pet: { breed: @pet.breed, kind: @pet.kind, name: @pet.name } }
+ patch pet_url(@pet), params: { pet: { breed: @pet.breed, kind: @pet.kind, name: @pet.name, weight: @pet.weight } }
assert_redirected_to pet_url(@pet)
end
diff --git a/test/fixtures/pets.yml b/test/fixtures/pets.yml
index ed65b20..6884959 100644
--- a/test/fixtures/pets.yml
+++ b/test/fixtures/pets.yml
@@ -1,11 +1,13 @@
# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
- name: MyString
- kind: MyString
- breed: MyString
+ name: Fido
+ kind: Dog
+ breed: Labrador
+ weight: 65
two:
- name: MyString
- kind: MyString
- breed: MyString
+ name: Figaro
+ kind: Cat
+ breed: Tabby
+ weight: 9.2
diff --git a/test/system/pets_test.rb b/test/system/pets_test.rb
index 6805822..1de90b3 100644
--- a/test/system/pets_test.rb
+++ b/test/system/pets_test.rb
@@ -17,6 +17,7 @@ class PetsTest < ApplicationSystemTestCase
fill_in "Breed", with: @pet.breed
fill_in "Kind", with: @pet.kind
fill_in "Name", with: @pet.name
+ fill_in "Weight", with: @pet.weight
click_on "Create Pet"
assert_text "Pet was successfully created"
@@ -30,6 +31,7 @@ class PetsTest < ApplicationSystemTestCase
fill_in "Breed", with: @pet.breed
fill_in "Kind", with: @pet.kind
fill_in "Name", with: @pet.name
+ fill_in "Weight", with: @pet.weight
click_on "Update Pet"
assert_text "Pet was successfully updated"
From 4bb13016c566c1d3e43e34af334de1311fac5e24 Mon Sep 17 00:00:00 2001
From: Andrew Canfield
Date: Tue, 11 Jun 2024 14:51:33 -0700
Subject: [PATCH 2/3] Added owner who can have many pets
---
app/assets/stylesheets/application.css | 15 ++++
app/controllers/owners_controller.rb | 70 +++++++++++++++++++
app/controllers/pets_controller.rb | 2 +-
app/models/owner.rb | 4 ++
app/models/pet.rb | 2 +
app/views/layouts/application.html.erb | 11 +++
app/views/owners/_form.html.erb | 22 ++++++
app/views/owners/_owner.html.erb | 7 ++
app/views/owners/_owner.json.jbuilder | 2 +
app/views/owners/edit.html.erb | 10 +++
app/views/owners/index.html.erb | 15 ++++
app/views/owners/index.json.jbuilder | 1 +
app/views/owners/new.html.erb | 9 +++
app/views/owners/show.html.erb | 13 ++++
app/views/owners/show.json.jbuilder | 1 +
app/views/pets/_form.html.erb | 5 ++
app/views/pets/_pet.html.erb | 2 +-
app/views/pets/index.html.erb | 6 +-
app/views/pets/show.html.erb | 6 ++
config/routes.rb | 2 +
db/migrate/20240610023329_create_owners.rb | 9 +++
.../20240610023511_add_owner_to_pets.rb | 5 ++
db/schema.rb | 11 ++-
db/seeds.rb | 26 ++++---
test/controllers/owners_controller_test.rb | 49 +++++++++++++
test/controllers/pets_controller_test.rb | 22 +++++-
test/fixtures/owners.yml | 9 +++
test/fixtures/pets.yml | 2 +
test/models/owner_test.rb | 7 ++
test/system/owners_test.rb | 41 +++++++++++
30 files changed, 371 insertions(+), 15 deletions(-)
create mode 100644 app/controllers/owners_controller.rb
create mode 100644 app/models/owner.rb
create mode 100644 app/views/owners/_form.html.erb
create mode 100644 app/views/owners/_owner.html.erb
create mode 100644 app/views/owners/_owner.json.jbuilder
create mode 100644 app/views/owners/edit.html.erb
create mode 100644 app/views/owners/index.html.erb
create mode 100644 app/views/owners/index.json.jbuilder
create mode 100644 app/views/owners/new.html.erb
create mode 100644 app/views/owners/show.html.erb
create mode 100644 app/views/owners/show.json.jbuilder
create mode 100644 db/migrate/20240610023329_create_owners.rb
create mode 100644 db/migrate/20240610023511_add_owner_to_pets.rb
create mode 100644 test/controllers/owners_controller_test.rb
create mode 100644 test/fixtures/owners.yml
create mode 100644 test/models/owner_test.rb
create mode 100644 test/system/owners_test.rb
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
index 288b9ab..f6b6c89 100644
--- a/app/assets/stylesheets/application.css
+++ b/app/assets/stylesheets/application.css
@@ -13,3 +13,18 @@
*= require_tree .
*= require_self
*/
+
+nav {
+ border-bottom: 1px solid #ffffff;
+}
+
+nav ul {
+ margin: 0;
+ padding: 10px 0;
+}
+
+nav ul li {
+ display: inline-block;
+ list-style-type: none;
+ padding-right: 20px;
+}
diff --git a/app/controllers/owners_controller.rb b/app/controllers/owners_controller.rb
new file mode 100644
index 0000000..377c420
--- /dev/null
+++ b/app/controllers/owners_controller.rb
@@ -0,0 +1,70 @@
+class OwnersController < ApplicationController
+ before_action :set_owner, only: %i[ show edit update destroy ]
+
+ # GET /owners or /owners.json
+ def index
+ @owners = Owner.all
+ end
+
+ # GET /owners/1 or /owners/1.json
+ def show
+ end
+
+ # GET /owners/new
+ def new
+ @owner = Owner.new
+ end
+
+ # GET /owners/1/edit
+ def edit
+ end
+
+ # POST /owners or /owners.json
+ def create
+ @owner = Owner.new(owner_params)
+
+ respond_to do |format|
+ if @owner.save
+ format.html { redirect_to owner_url(@owner), notice: "Owner was successfully created." }
+ format.json { render :show, status: :created, location: @owner }
+ else
+ format.html { render :new, status: :unprocessable_entity }
+ format.json { render json: @owner.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # PATCH/PUT /owners/1 or /owners/1.json
+ def update
+ respond_to do |format|
+ if @owner.update(owner_params)
+ format.html { redirect_to owner_url(@owner), notice: "Owner was successfully updated." }
+ format.json { render :show, status: :ok, location: @owner }
+ else
+ format.html { render :edit, status: :unprocessable_entity }
+ format.json { render json: @owner.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # DELETE /owners/1 or /owners/1.json
+ def destroy
+ @owner.destroy!
+
+ respond_to do |format|
+ format.html { redirect_to owners_url, notice: "Owner was successfully destroyed." }
+ format.json { head :no_content }
+ end
+ end
+
+ private
+ # Use callbacks to share common setup or constraints between actions.
+ def set_owner
+ @owner = Owner.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def owner_params
+ params.require(:owner).permit(:name)
+ end
+end
diff --git a/app/controllers/pets_controller.rb b/app/controllers/pets_controller.rb
index fc26672..28b0b81 100644
--- a/app/controllers/pets_controller.rb
+++ b/app/controllers/pets_controller.rb
@@ -65,6 +65,6 @@ def set_pet
# Only allow a list of trusted parameters through.
def pet_params
- params.require(:pet).permit(:name, :kind, :breed, :weight)
+ params.require(:pet).permit(:name, :kind, :breed, :weight, :owner_id)
end
end
diff --git a/app/models/owner.rb b/app/models/owner.rb
new file mode 100644
index 0000000..510c4d4
--- /dev/null
+++ b/app/models/owner.rb
@@ -0,0 +1,4 @@
+class Owner < ApplicationRecord
+
+ has_many :pets, dependent: :destroy
+end
diff --git a/app/models/pet.rb b/app/models/pet.rb
index d1efb8a..1eee4f2 100644
--- a/app/models/pet.rb
+++ b/app/models/pet.rb
@@ -1,2 +1,4 @@
class Pet < ApplicationRecord
+
+ belongs_to :owner
end
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 1cd1804..817e15e 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -11,6 +11,17 @@
+
+
+
+
<%= yield %>
+
+