Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
8 changes: 8 additions & 0 deletions app/controllers/breeds_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@


class BreedsController < ApplicationController
def show
id = Breed.find_by(name: params[:name]).id
@data = DogApiService.get_breed(id)['data']
end
end
70 changes: 70 additions & 0 deletions app/controllers/owners_controller.rb
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion app/controllers/pets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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, :owner_id)
end
end
3 changes: 3 additions & 0 deletions app/models/breed.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Breed < ApplicationRecord

end
4 changes: 4 additions & 0 deletions app/models/owner.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class Owner < ApplicationRecord

has_many :pets, dependent: :destroy
end
2 changes: 2 additions & 0 deletions app/models/pet.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
class Pet < ApplicationRecord

belongs_to :owner
end
17 changes: 17 additions & 0 deletions app/services/dog_api_service.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
require 'net/http'

class DogApiService

def self.list_breeds(page=1)
uri = URI("https://dogapi.dog/api/v2/breeds?page[number]=#{page}")
response = Net::HTTP.get_response(uri)
JSON.parse(response.body)
end

def self.get_breed(id)
uri = URI.parse("https://dogapi.dog/api/v2/breeds/#{id}")
response = Net::HTTP.get_response(uri)
JSON.parse(response.body)
end

end
13 changes: 13 additions & 0 deletions app/views/breeds/show.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<h2>Breed Details</h2>

<p>
id: <%= @data['id'] %>
</p>

<p>
name: <%= @data['attributes']['name'] %>
</p>

<p>
description: <%= @data['attributes']['description'] %>
</p>
11 changes: 11 additions & 0 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@
</head>

<body>

<nav>
<ul>
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Pets", pets_path %></li>
</ul>
</nav>

<main>
<%= yield %>
</main>

</body>
</html>
22 changes: 22 additions & 0 deletions app/views/owners/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<%= form_with(model: owner) do |form| %>
<% if owner.errors.any? %>
<div style="color: red">
<h2><%= pluralize(owner.errors.count, "error") %> prohibited this owner from being saved:</h2>

<ul>
<% owner.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>

<div>
<%= form.label :name, style: "display: block" %>
<%= form.text_field :name %>
</div>

<div>
<%= form.submit %>
</div>
<% end %>
7 changes: 7 additions & 0 deletions app/views/owners/_owner.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<div id="<%= dom_id owner %>">
<p>
<strong>Owner:</strong>
<%= owner.name %>
</p>

</div>
2 changes: 2 additions & 0 deletions app/views/owners/_owner.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
json.extract! owner, :id, :name, :created_at, :updated_at
json.url owner_url(owner, format: :json)
10 changes: 10 additions & 0 deletions app/views/owners/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<h1>Editing owner</h1>

<%= render "form", owner: @owner %>

<br>

<div>
<%= link_to "Show this owner", @owner %> |
<%= link_to "Back to owners", owners_path %>
</div>
15 changes: 15 additions & 0 deletions app/views/owners/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<p style="color: green"><%= notice %></p>

<h1>Owners</h1>

<%= link_to "New owner", new_owner_path %>

<div id="owners">
<% @owners.each do |owner| %>
<%= render owner %>
<p>
<%= link_to "Show this owner", owner %>
</p>
<hr>
<% end %>
</div>
1 change: 1 addition & 0 deletions app/views/owners/index.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
json.array! @owners, partial: "owners/owner", as: :owner
9 changes: 9 additions & 0 deletions app/views/owners/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<h1>New owner</h1>

<%= render "form", owner: @owner %>

<br>

<div>
<%= link_to "Back to owners", owners_path %>
</div>
13 changes: 13 additions & 0 deletions app/views/owners/show.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<p style="color: green"><%= notice %></p>

<%= render @owner %>

<%= render partial: "pets/pet", collection: @owner.pets %>


<div>
<%= link_to "Edit this owner", edit_owner_path(@owner) %> |
<%= link_to "Back to owners", owners_path %>

<%= button_to "Destroy this owner", @owner, method: :delete %>
</div>
1 change: 1 addition & 0 deletions app/views/owners/show.json.jbuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
json.partial! "owners/owner", owner: @owner
10 changes: 10 additions & 0 deletions app/views/pets/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
</div>
<% end %>

<div>
<%= form.label :owner, style: "display: block" %>
<%= form.collection_select :owner_id, Owner.all, :id, :name %>
</div>

<div>
<%= form.label :name, style: "display: block" %>
<%= form.text_field :name %>
Expand All @@ -26,6 +31,11 @@
<%= form.text_field :breed %>
</div>

<div>
<%= form.label :weight, style: "display: block" %>
<%= form.number_field :weight %>
</div>

<div>
<%= form.submit %>
</div>
Expand Down
9 changes: 7 additions & 2 deletions app/views/pets/_pet.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div id="<%= dom_id pet %>">
<p>
<strong>Name:</strong>
<%= pet.name %>
<%= link_to pet.name, pet %>
</p>

<p>
Expand All @@ -11,7 +11,12 @@

<p>
<strong>Breed:</strong>
<%= pet.breed %>
<%= link_to pet.breed, breeds_show_path(name: pet.breed) %>
</p>

<p>
<strong>Weight:</strong>
<%= pet.weight %>
</p>

</div>
2 changes: 1 addition & 1 deletion app/views/pets/_pet.json.jbuilder
Original file line number Diff line number Diff line change
@@ -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)
6 changes: 4 additions & 2 deletions app/views/pets/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

<h1>Pets</h1>

<%= link_to "New pet", new_pet_path %>

<div id="pets">
<% @pets.each do |pet| %>
<%= render pet %>
<p>
<%= link_to "Show this pet", pet %>
</p>

<hr>
<% end %>
</div>

<%= link_to "New pet", new_pet_path %>
6 changes: 6 additions & 0 deletions app/views/pets/show.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
<p style="color: green"><%= notice %></p>


<%= render @pet %>

<p>
<strong>Owner:</strong>
<%= link_to @pet.owner.name, @pet.owner %>
</p>

<div>
<%= link_to "Edit this pet", edit_pet_path(@pet) %> |
<%= link_to "Back to pets", pets_path %>
Expand Down
3 changes: 3 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
Rails.application.routes.draw do
get 'breeds/show'
resources :owners
resources :pets
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

Expand All @@ -8,4 +10,5 @@

# Defines the root path route ("/")
# root "posts#index"
root "owners#index"
end
5 changes: 5 additions & 0 deletions db/migrate/20240609173229_add_weight_to_pets.rb
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions db/migrate/20240610023329_create_owners.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class CreateOwners < ActiveRecord::Migration[7.1]
def change
create_table :owners do |t|
t.string :name

t.timestamps
end
end
end
5 changes: 5 additions & 0 deletions db/migrate/20240610023511_add_owner_to_pets.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddOwnerToPets < ActiveRecord::Migration[7.1]
def change
add_reference :pets, :owner, null: false, foreign_key: true
end
end
12 changes: 12 additions & 0 deletions db/migrate/20240612143827_create_breeds.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class CreateBreeds < ActiveRecord::Migration[7.1]
def change
#sqllite does not support the uuid datatype
create_table :breeds, id: :string do |t|
t.string :name

t.timestamps
end

add_index :breeds, :name, unique: true
end
end
Loading