diff --git a/app/controllers/allergens_controller.rb b/app/controllers/allergens_controller.rb
new file mode 100644
index 0000000..fbd8633
--- /dev/null
+++ b/app/controllers/allergens_controller.rb
@@ -0,0 +1,69 @@
+class AllergensController < ApplicationController
+ before_action :set_allergen, only: %i[show edit update destroy]
+
+ # GET /allergens or /allergens.json
+ def index
+ @allergens = Allergen.all
+ end
+
+ # GET /allergens/1 or /allergens/1.json
+ def show; end
+
+ # GET /allergens/new
+ def new
+ @allergen = Allergen.new
+ end
+
+ # GET /allergens/1/edit
+ def edit; end
+
+ # POST /allergens or /allergens.json
+ def create
+ @allergen = Allergen.new(allergen_params)
+
+ respond_to do |format|
+ if @allergen.save
+ format.html { redirect_to allergen_url(@allergen), notice: t(:allergen_created) }
+ format.json { render :show, status: :created, location: @allergen }
+ else
+ format.html { render :new, status: :unprocessable_entity }
+ format.json { render json: @allergen.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # PATCH/PUT /allergens/1 or /allergens/1.json
+ def update
+ respond_to do |format|
+ if @allergen.update(allergen_params)
+ format.html { redirect_to allergen_url(@allergen), notice: t(:allergen_updated) }
+ format.json { render :show, status: :ok, location: @allergen }
+ else
+ format.html { render :edit, status: :unprocessable_entity }
+ format.json { render json: @allergen.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ # DELETE /allergens/1 or /allergens/1.json
+ def destroy
+ @allergen.destroy
+
+ respond_to do |format|
+ format.html { redirect_to allergens_url, notice: t(:allergen_destroyed) }
+ format.json { head :no_content }
+ end
+ end
+
+ private
+
+ # Use callbacks to share common setup or constraints between actions.
+ def set_allergen
+ @allergen = Allergen.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def allergen_params
+ params.require(:allergen).permit(:name)
+ end
+end
diff --git a/app/helpers/allergens_helper.rb b/app/helpers/allergens_helper.rb
new file mode 100644
index 0000000..78eb3d2
--- /dev/null
+++ b/app/helpers/allergens_helper.rb
@@ -0,0 +1,2 @@
+module AllergensHelper
+end
diff --git a/app/models/allergen.rb b/app/models/allergen.rb
new file mode 100644
index 0000000..7914eea
--- /dev/null
+++ b/app/models/allergen.rb
@@ -0,0 +1,2 @@
+class Allergen < ApplicationRecord
+end
diff --git a/app/views/allergens/_allergen.html.erb b/app/views/allergens/_allergen.html.erb
new file mode 100644
index 0000000..2226d67
--- /dev/null
+++ b/app/views/allergens/_allergen.html.erb
@@ -0,0 +1,7 @@
+
+
+ Name:
+ <%= allergen.name %>
+
+
+
diff --git a/app/views/allergens/_allergen.json.jbuilder b/app/views/allergens/_allergen.json.jbuilder
new file mode 100644
index 0000000..b8ba360
--- /dev/null
+++ b/app/views/allergens/_allergen.json.jbuilder
@@ -0,0 +1,2 @@
+json.extract! allergen, :id, :name, :created_at, :updated_at
+json.url allergen_url(allergen, format: :json)
diff --git a/app/views/allergens/_form.html.erb b/app/views/allergens/_form.html.erb
new file mode 100644
index 0000000..a98d880
--- /dev/null
+++ b/app/views/allergens/_form.html.erb
@@ -0,0 +1,22 @@
+<%= form_with(model: allergen) do |form| %>
+ <% if allergen.errors.any? %>
+
+
<%= pluralize(allergen.errors.count, "error") %> prohibited this allergen from being saved:
+
+
+ <% allergen.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :name, style: "display: block" %>
+ <%= form.text_field :name %>
+
+
+
+ <%= form.submit %>
+
+<% end %>
diff --git a/app/views/allergens/edit.html.erb b/app/views/allergens/edit.html.erb
new file mode 100644
index 0000000..f6a0acf
--- /dev/null
+++ b/app/views/allergens/edit.html.erb
@@ -0,0 +1,10 @@
+Editing allergen
+
+<%= render "form", allergen: @allergen %>
+
+
+
+
+ <%= link_to "Show this allergen", @allergen %> |
+ <%= link_to "Back to allergens", allergens_path %>
+
diff --git a/app/views/allergens/index.html.erb b/app/views/allergens/index.html.erb
new file mode 100644
index 0000000..700623a
--- /dev/null
+++ b/app/views/allergens/index.html.erb
@@ -0,0 +1,14 @@
+<%= notice %>
+
+Allergens
+
+
+ <% @allergens.each do |allergen| %>
+ <%= render allergen %>
+
+ <%= link_to "Show this allergen", allergen %>
+
+ <% end %>
+
+
+<%= link_to "New allergen", new_allergen_path %>
diff --git a/app/views/allergens/index.json.jbuilder b/app/views/allergens/index.json.jbuilder
new file mode 100644
index 0000000..428eaea
--- /dev/null
+++ b/app/views/allergens/index.json.jbuilder
@@ -0,0 +1 @@
+json.array! @allergens, partial: 'allergens/allergen', as: :allergen
diff --git a/app/views/allergens/new.html.erb b/app/views/allergens/new.html.erb
new file mode 100644
index 0000000..5e52786
--- /dev/null
+++ b/app/views/allergens/new.html.erb
@@ -0,0 +1,9 @@
+New allergen
+
+<%= render "form", allergen: @allergen %>
+
+
+
+
+ <%= link_to "Back to allergens", allergens_path %>
+
diff --git a/app/views/allergens/show.html.erb b/app/views/allergens/show.html.erb
new file mode 100644
index 0000000..f36dd98
--- /dev/null
+++ b/app/views/allergens/show.html.erb
@@ -0,0 +1,10 @@
+<%= notice %>
+
+<%= render @allergen %>
+
+
+ <%= link_to "Edit this allergen", edit_allergen_path(@allergen) %> |
+ <%= link_to "Back to allergens", allergens_path %>
+
+ <%= button_to "Destroy this allergen", @allergen, method: :delete %>
+
diff --git a/app/views/allergens/show.json.jbuilder b/app/views/allergens/show.json.jbuilder
new file mode 100644
index 0000000..c8c2400
--- /dev/null
+++ b/app/views/allergens/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'allergens/allergen', allergen: @allergen
diff --git a/config/locales/en.yml b/config/locales/en.yml
index dd891d8..a673da5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -55,3 +55,6 @@ en:
ingredient_created: 'Ingredient was successfully created.'
ingredient_updated: 'Ingredient was successfully updated.'
ingredient_destroyed: 'Ingredient was successfully destroyed.'
+ allergen_created: 'Allergen was successfully created.'
+ allergen_updated: 'Allergen was successfully updated.'
+ allergen_destroyed: 'Allergen was successfully destroyed.'
diff --git a/config/routes.rb b/config/routes.rb
index c42345a..ba56139 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
Rails.application.routes.draw do
+ resources :allergens
resources :category_ingredients
resources :ingredients
resources :avoid_foods
diff --git a/db/migrate/20221220190847_create_allergens.rb b/db/migrate/20221220190847_create_allergens.rb
new file mode 100644
index 0000000..17d372f
--- /dev/null
+++ b/db/migrate/20221220190847_create_allergens.rb
@@ -0,0 +1,9 @@
+class CreateAllergens < ActiveRecord::Migration[7.0]
+ def change
+ create_table :allergens do |t|
+ t.string :name
+
+ t.timestamps
+ end
+ end
+end
diff --git a/test/controllers/allergens_controller_test.rb b/test/controllers/allergens_controller_test.rb
new file mode 100644
index 0000000..7453446
--- /dev/null
+++ b/test/controllers/allergens_controller_test.rb
@@ -0,0 +1,48 @@
+require 'test_helper'
+
+class AllergensControllerTest < ActionDispatch::IntegrationTest
+ setup do
+ @allergen = allergens(:one)
+ end
+
+ test 'should get index' do
+ get allergens_url
+ assert_response :success
+ end
+
+ test 'should get new' do
+ get new_allergen_url
+ assert_response :success
+ end
+
+ test 'should create allergen' do
+ assert_difference('Allergen.count') do
+ post allergens_url, params: { allergen: { name: @allergen.name } }
+ end
+
+ assert_redirected_to allergen_url(Allergen.last)
+ end
+
+ test 'should show allergen' do
+ get allergen_url(@allergen)
+ assert_response :success
+ end
+
+ test 'should get edit' do
+ get edit_allergen_url(@allergen)
+ assert_response :success
+ end
+
+ test 'should update allergen' do
+ patch allergen_url(@allergen), params: { allergen: { name: @allergen.name } }
+ assert_redirected_to allergen_url(@allergen)
+ end
+
+ test 'should destroy allergen' do
+ assert_difference('Allergen.count', -1) do
+ delete allergen_url(@allergen)
+ end
+
+ assert_redirected_to allergens_url
+ end
+end
diff --git a/test/fixtures/allergens.yml b/test/fixtures/allergens.yml
new file mode 100644
index 0000000..7d41224
--- /dev/null
+++ b/test/fixtures/allergens.yml
@@ -0,0 +1,7 @@
+# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+ name: MyString
+
+two:
+ name: MyString
diff --git a/test/models/allergen_test.rb b/test/models/allergen_test.rb
new file mode 100644
index 0000000..51e31ce
--- /dev/null
+++ b/test/models/allergen_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class AllergenTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/system/allergens_test.rb b/test/system/allergens_test.rb
new file mode 100644
index 0000000..0749d52
--- /dev/null
+++ b/test/system/allergens_test.rb
@@ -0,0 +1,41 @@
+require 'application_system_test_case'
+
+class AllergensTest < ApplicationSystemTestCase
+ setup do
+ @allergen = allergens(:one)
+ end
+
+ test 'visiting the index' do
+ visit allergens_url
+ assert_selector 'h1', text: 'Allergens'
+ end
+
+ test 'should create allergen' do
+ visit allergens_url
+ click_on 'New allergen'
+
+ fill_in 'Name', with: @allergen.name
+ click_on 'Create Allergen'
+
+ assert_text 'Allergen was successfully created'
+ click_on 'Back'
+ end
+
+ test 'should update Allergen' do
+ visit allergen_url(@allergen)
+ click_on 'Edit this allergen', match: :first
+
+ fill_in 'Name', with: @allergen.name
+ click_on 'Update Allergen'
+
+ assert_text 'Allergen was successfully updated'
+ click_on 'Back'
+ end
+
+ test 'should destroy Allergen' do
+ visit allergen_url(@allergen)
+ click_on 'Destroy this allergen', match: :first
+
+ assert_text 'Allergen was successfully destroyed'
+ end
+end