diff --git a/app/controllers/wishlists_controller.rb b/app/controllers/wishlists_controller.rb
new file mode 100644
index 0000000..ad21450
--- /dev/null
+++ b/app/controllers/wishlists_controller.rb
@@ -0,0 +1,70 @@
+class WishlistsController < ApplicationController
+ before_action :set_wishlist, only: %i[ show edit update destroy ]
+
+ # GET /wishlists or /wishlists.json
+ def index
+ @wishlists = Wishlist.all
+ end
+
+ # GET /wishlists/1 or /wishlists/1.json
+ def show
+ end
+
+ # GET /wishlists/new
+ def new
+ @wishlist = Wishlist.new
+ end
+
+ # GET /wishlists/1/edit
+ def edit
+ end
+
+ # POST /wishlists or /wishlists.json
+ def create
+ @wishlist = Wishlist.new(wishlist_params)
+
+ respond_to do |format|
+ if @wishlist.save
+ format.html { redirect_to wishlist_url(@wishlist), notice: "Wishlist was successfully created." }
+ format.json { render :show, status: :created, location: @wishlist }
+ else
+ format.html { render :new, status: :unprocessable_entity }
+ format.json { render json: @wishlist.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # PATCH/PUT /wishlists/1 or /wishlists/1.json
+ def update
+ respond_to do |format|
+ if @wishlist.update(wishlist_params)
+ format.html { redirect_to wishlist_url(@wishlist), notice: "Wishlist was successfully updated." }
+ format.json { render :show, status: :ok, location: @wishlist }
+ else
+ format.html { render :edit, status: :unprocessable_entity }
+ format.json { render json: @wishlist.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # DELETE /wishlists/1 or /wishlists/1.json
+ def destroy
+ @wishlist.destroy
+
+ respond_to do |format|
+ format.html { redirect_to wishlists_url, notice: "Wishlist was successfully destroyed." }
+ format.json { head :no_content }
+ end
+ end
+
+ private
+ # Use callbacks to share common setup or constraints between actions.
+ def set_wishlist
+ @wishlist = Wishlist.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def wishlist_params
+ params.require(:wishlist).permit([:name])
+ end
+end
diff --git a/app/helpers/wishlists_helper.rb b/app/helpers/wishlists_helper.rb
new file mode 100644
index 0000000..1fb0b3a
--- /dev/null
+++ b/app/helpers/wishlists_helper.rb
@@ -0,0 +1,2 @@
+module WishlistsHelper
+end
diff --git a/app/views/wishlists/_form.html.erb b/app/views/wishlists/_form.html.erb
new file mode 100644
index 0000000..49e19bf
--- /dev/null
+++ b/app/views/wishlists/_form.html.erb
@@ -0,0 +1,19 @@
+<%= form_with(model: wishlist, class: "contents") do |form| %>
+ <% if wishlist.errors.any? %>
+
+
<%= pluralize(wishlist.errors.count, "error") %> prohibited this wishlist from being saved:
+
+
+ <% wishlist.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+ <%= form.text_field :name %>
+
+
+ <%= form.submit class: "rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer" %>
+
+<% end %>
diff --git a/app/views/wishlists/_wishlist.html.erb b/app/views/wishlists/_wishlist.html.erb
new file mode 100644
index 0000000..00e2cf1
--- /dev/null
+++ b/app/views/wishlists/_wishlist.html.erb
@@ -0,0 +1,28 @@
+
+ <% if action_name != "show" %>
+ <%= link_to "Show this wishlist", wishlist, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+ <%= link_to 'Edit this wishlist', edit_wishlist_path(wishlist), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %>
+
+ <% end %>
+
+
+
+
+ Attribute |
+ Value |
+
+
+
+
+
+ ID |
+ <%= @wishlist.id %> |
+
+
+
+ Name |
+ <%= @wishlist.name %> |
+
+
+
+
diff --git a/app/views/wishlists/_wishlist.json.jbuilder b/app/views/wishlists/_wishlist.json.jbuilder
new file mode 100644
index 0000000..22039d7
--- /dev/null
+++ b/app/views/wishlists/_wishlist.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! wishlist, :id, :name, :created_at, :updated_at
+json.url wishlist_url(wishlist, format: :json)
diff --git a/app/views/wishlists/edit.html.erb b/app/views/wishlists/edit.html.erb
new file mode 100644
index 0000000..5fa1485
--- /dev/null
+++ b/app/views/wishlists/edit.html.erb
@@ -0,0 +1,8 @@
+
+
Editing wishlist
+
+ <%= render "form", wishlist: @wishlist %>
+
+ <%= link_to "Show this wishlist", @wishlist, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+ <%= link_to "Back to wishlists", wishlists_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+
diff --git a/app/views/wishlists/index.html.erb b/app/views/wishlists/index.html.erb
new file mode 100644
index 0000000..408c738
--- /dev/null
+++ b/app/views/wishlists/index.html.erb
@@ -0,0 +1,37 @@
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+
+
Wishlists
+ <%= link_to 'New wishlist', new_wishlist_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
+
+
+
+
diff --git a/app/views/wishlists/index.json.jbuilder b/app/views/wishlists/index.json.jbuilder
new file mode 100644
index 0000000..9e44981
--- /dev/null
+++ b/app/views/wishlists/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @wishlists, partial: "wishlists/wishlist", as: :wishlist
diff --git a/app/views/wishlists/new.html.erb b/app/views/wishlists/new.html.erb
new file mode 100644
index 0000000..ccc332e
--- /dev/null
+++ b/app/views/wishlists/new.html.erb
@@ -0,0 +1,7 @@
+
+
New wishlist
+
+ <%= render "form", wishlist: @wishlist %>
+
+ <%= link_to 'Back to wishlists', wishlists_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+
diff --git a/app/views/wishlists/show.html.erb b/app/views/wishlists/show.html.erb
new file mode 100644
index 0000000..79a04cd
--- /dev/null
+++ b/app/views/wishlists/show.html.erb
@@ -0,0 +1,15 @@
+
+
+ <% if notice.present? %>
+
<%= notice %>
+ <% end %>
+
+ <%= render @wishlist %>
+
+ <%= link_to 'Edit this wishlist', edit_wishlist_path(@wishlist), class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+
+ <%= button_to 'Destroy this wishlist', wishlist_path(@wishlist), method: :delete, class: "mt-2 rounded-lg py-3 px-5 bg-gray-100 font-medium" %>
+
+ <%= link_to 'Back to wishlists', wishlists_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
+
+
diff --git a/app/views/wishlists/show.json.jbuilder b/app/views/wishlists/show.json.jbuilder
new file mode 100644
index 0000000..2ca58cb
--- /dev/null
+++ b/app/views/wishlists/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! "wishlists/wishlist", wishlist: @wishlist
diff --git a/spec/routing/wishlists_routing_spec.rb b/spec/routing/wishlists_routing_spec.rb
new file mode 100644
index 0000000..fda086f
--- /dev/null
+++ b/spec/routing/wishlists_routing_spec.rb
@@ -0,0 +1,38 @@
+require "rails_helper"
+
+RSpec.describe WishlistsController, type: :routing do
+ describe "routing" do
+ it "routes to #index" do
+ expect(get: "/wishlists").to route_to("wishlists#index")
+ end
+
+ it "routes to #new" do
+ expect(get: "/wishlists/new").to route_to("wishlists#new")
+ end
+
+ it "routes to #show" do
+ expect(get: "/wishlists/1").to route_to("wishlists#show", id: "1")
+ end
+
+ it "routes to #edit" do
+ expect(get: "/wishlists/1/edit").to route_to("wishlists#edit", id: "1")
+ end
+
+
+ it "routes to #create" do
+ expect(post: "/wishlists").to route_to("wishlists#create")
+ end
+
+ it "routes to #update via PUT" do
+ expect(put: "/wishlists/1").to route_to("wishlists#update", id: "1")
+ end
+
+ it "routes to #update via PATCH" do
+ expect(patch: "/wishlists/1").to route_to("wishlists#update", id: "1")
+ end
+
+ it "routes to #destroy" do
+ expect(delete: "/wishlists/1").to route_to("wishlists#destroy", id: "1")
+ end
+ end
+end
diff --git a/spec/views/wishlists/edit.html.tailwindcss_spec.rb b/spec/views/wishlists/edit.html.tailwindcss_spec.rb
new file mode 100644
index 0000000..6e6a8dc
--- /dev/null
+++ b/spec/views/wishlists/edit.html.tailwindcss_spec.rb
@@ -0,0 +1,18 @@
+require 'rails_helper'
+
+RSpec.describe "wishlists/edit", type: :view do
+ let(:wishlist) {
+ Wishlist.create!(name: 'Euphorbia Atrox')
+ }
+
+ before(:each) do
+ assign(:wishlist, wishlist)
+ end
+
+ it "renders the edit wishlist form" do
+ render
+
+ assert_select "form[action=?][method=?]", wishlist_path(wishlist), "post" do
+ end
+ end
+end
diff --git a/spec/views/wishlists/index.html.tailwindcss_spec.rb b/spec/views/wishlists/index.html.tailwindcss_spec.rb
new file mode 100644
index 0000000..5cca845
--- /dev/null
+++ b/spec/views/wishlists/index.html.tailwindcss_spec.rb
@@ -0,0 +1,15 @@
+require 'rails_helper'
+
+RSpec.describe "wishlists/index", type: :view do
+ before(:each) do
+ assign(:wishlists, [
+ Wishlist.create!(name: 'giga'),
+ Wishlist.create!(name: 'omega')
+ ])
+ end
+
+ it "renders a list of wishlists" do
+ render
+ cell_selector = Rails::VERSION::STRING >= '7' ? 'div>p' : 'tr>td'
+ end
+end
diff --git a/spec/views/wishlists/new.html.tailwindcss_spec.rb b/spec/views/wishlists/new.html.tailwindcss_spec.rb
new file mode 100644
index 0000000..39906e6
--- /dev/null
+++ b/spec/views/wishlists/new.html.tailwindcss_spec.rb
@@ -0,0 +1,14 @@
+require 'rails_helper'
+
+RSpec.describe "wishlists/new", type: :view do
+ before(:each) do
+ assign(:wishlist, Wishlist.new(name: 'omega'))
+ end
+
+ it "renders new wishlist form" do
+ render
+
+ assert_select "form[action=?][method=?]", wishlists_path, "post" do
+ end
+ end
+end
diff --git a/spec/views/wishlists/show.html.tailwindcss_spec.rb b/spec/views/wishlists/show.html.tailwindcss_spec.rb
new file mode 100644
index 0000000..b6930e1
--- /dev/null
+++ b/spec/views/wishlists/show.html.tailwindcss_spec.rb
@@ -0,0 +1,11 @@
+require 'rails_helper'
+
+RSpec.describe "wishlists/show", type: :view do
+ before(:each) do
+ assign(:wishlist, Wishlist.create!(name: 'giga'))
+ end
+
+ it "renders attributes in " do
+ render
+ end
+end
diff --git a/test/controllers/wishlists_controller_test.rb b/test/controllers/wishlists_controller_test.rb
new file mode 100644
index 0000000..2c98455
--- /dev/null
+++ b/test/controllers/wishlists_controller_test.rb
@@ -0,0 +1,48 @@
+require "test_helper"
+
+class WishlistControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ @wishlist = wishlists(:one)
+ end
+
+ test "should get index" do
+ get wishlists_url
+ assert_response :success
+ end
+
+ test "should get new" do
+ get new_wishlist_url
+ assert_response :success
+ end
+
+ test "should create wishlist" do
+ assert_difference("Wishlist.count") do
+ post wishlists_url, params: { wishlist: { name: 'PlantThree' } }
+ end
+
+ assert_redirected_to wishlist_url(Wishlist.last)
+ end
+
+ test "should show wishlist" do
+ get wishlist_url(@wishlist)
+ assert_response :success
+ end
+
+ test "should get edit" do
+ get edit_wishlist_url(@wishlist)
+ assert_response :success
+ end
+
+ test "should update wishlist" do
+ patch wishlist_url(@wishlist), params: { wishlist: { name: 'PlantFour' } }
+ assert_redirected_to wishlist_url(@wishlist)
+ end
+
+ test "should destroy wishlist" do
+ assert_difference("Wishlist.count", -1) do
+ delete wishlist_url(@wishlist)
+ end
+
+ assert_redirected_to wishlists_url
+ end
+end
diff --git a/test/fixtures/wishlists.yml b/test/fixtures/wishlists.yml
new file mode 100644
index 0000000..df98dc6
--- /dev/null
+++ b/test/fixtures/wishlists.yml
@@ -0,0 +1,3 @@
+one:
+ id: 1
+ name: 'Euphorbia Atrox'
\ No newline at end of file