From 6b442b6c3b4b9aac220b5bd8a33cafe8953136af Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Tue, 17 May 2022 07:54:55 +0200 Subject: [PATCH 01/12] Created controller methods for recipes --- Gemfile | 4 ++-- Gemfile.lock | 9 +++++++- app/controllers/recipes_controller.rb | 33 ++++++++++++++++++++++++++- app/models/inventory_food.rb | 3 +++ app/models/recipe.rb | 4 ++++ app/models/recipe_food.rb | 3 +++ app/views/recipes/index.html.erb | 16 ++++++++++++- config/database.yml | 2 ++ db/seeds.rb | 19 +++++++++++++++ 9 files changed, 88 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 85f08e0..b64ed53 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '3.0.1' +ruby '3.0.4' # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem 'rails', '~> 7.0.2', '>= 7.0.2.3' @@ -46,7 +46,7 @@ gem 'cancancan', '~> 1.9' # gem "bcrypt", "~> 3.1.7" # Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] +gem 'tzinfo-data' # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 58abf81..2cc8a25 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -110,6 +110,7 @@ GEM faker (2.21.0) i18n (>= 1.8.11, < 2) ffi (1.15.5) + ffi (1.15.5-x86-mingw32) globalid (1.0.0) activesupport (>= 5.0) i18n (1.10.0) @@ -157,6 +158,8 @@ GEM net-protocol timeout nio4r (2.5.8) + nokogiri (1.13.6-x86-mingw32) + racc (~> 1.4) nokogiri (1.13.6-x86_64-darwin) racc (~> 1.4) orm_adapter (0.5.0) @@ -164,6 +167,7 @@ GEM parser (3.1.2.0) ast (~> 2.4.1) pg (1.3.5) + pg (1.3.5-x86-mingw32) public_suffix (4.0.7) puma (5.6.4) nio4r (~> 2.0) @@ -259,6 +263,8 @@ GEM railties (>= 6.0.0) tzinfo (2.0.4) concurrent-ruby (~> 1.0) + tzinfo-data (1.2022.1) + tzinfo (>= 1.0.0) unicode-display_width (2.1.0) uniform_notifier (1.16.0) warden (1.2.9) @@ -280,6 +286,7 @@ GEM zeitwerk (2.5.4) PLATFORMS + x86-mingw32 x86_64-darwin-19 DEPENDENCIES @@ -310,7 +317,7 @@ DEPENDENCIES webdrivers RUBY VERSION - ruby 3.0.1p64 + ruby 3.0.4p208 BUNDLED WITH 2.3.12 diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 9a84af9..90c2f1a 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -1,3 +1,34 @@ class RecipesController < ApplicationController - def index; end + def index + @recipes = Recipe.all + end + + def show + @recipe = Recipe.find(params[:id]) + end + + def new + @recipe = Recipe.new + end + + def create + @recipe = Recipe.new(recipe_params) + if @recipe.save + redirect_to @recipe + else + render 'new' + end + end + + def destroy + @recipe = Recipe.find(params[:id]) + @recipe.destroy + redirect_to recipes_path + end + + private + + def recipe_params + params.require(:recipe).permit(:name, :description, :user_id) + end end diff --git a/app/models/inventory_food.rb b/app/models/inventory_food.rb index 60dda6f..ee1273d 100644 --- a/app/models/inventory_food.rb +++ b/app/models/inventory_food.rb @@ -1,4 +1,7 @@ class InventoryFood < ApplicationRecord belongs_to :food belongs_to :inventory + + validates :food_id, presence: true + validates :inventory_id, presence: true end diff --git a/app/models/recipe.rb b/app/models/recipe.rb index 7fd8cc6..1d8ec3f 100644 --- a/app/models/recipe.rb +++ b/app/models/recipe.rb @@ -1,4 +1,8 @@ class Recipe < ApplicationRecord belongs_to :user has_many :recipe_foods, dependent: :destroy + + validates :name, presence: true + validates :description, presence: true + validates :user_id, presence: true end diff --git a/app/models/recipe_food.rb b/app/models/recipe_food.rb index de4c992..627482c 100644 --- a/app/models/recipe_food.rb +++ b/app/models/recipe_food.rb @@ -1,4 +1,7 @@ class RecipeFood < ApplicationRecord belongs_to :recipe belongs_to :food + + validates :recipe_id, presence: true + validates :food_id, presence: true end diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index e680043..425a00e 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,3 +1,17 @@ <%= button_to "Sign Out", destroy_user_session_path, method: 'delete', :"data-turbolinks" => false %> -<%= image_tag current_user.image.variant(resize_to_fill: [150, nil]) ? current_user.image : 'https://cdn.pixabay.com/photo/2016/04/01/10/11/avatar-1299805__340.png', class: "rounded-circle mr-2" if current_user %> \ No newline at end of file +<%= image_tag current_user.image.variant(resize_to_fill: [150, nil]) ? current_user.image : 'https://cdn.pixabay.com/photo/2016/04/01/10/11/avatar-1299805__340.png', class: "rounded-circle mr-2" if current_user %> + + +<% @recipes.each do |recipe| %> + <%= link_to recipe.name, recipe_path(recipe.id) %> + <%= recipe.description %> + <%= recipe.preparation_time %> + <%= recipe.cooking_time %> + <%= link_to "Delete", recipe_path(recipe.id), method: :delete, data: { confirm: "Are you sure?" } %> + <%= link_to "Show", recipe_path(recipe.id) %> + <%= link_to "Back", recipes_path %> +<% end %> + + + diff --git a/config/database.yml b/config/database.yml index b4f9972..d62e4a8 100644 --- a/config/database.yml +++ b/config/database.yml @@ -24,6 +24,8 @@ default: &default development: <<: *default database: recipe_app_development + username: postgres + password: root # The specified database role being used to connect to postgres. # To create additional roles in postgres see `$ createuser --help`. diff --git a/db/seeds.rb b/db/seeds.rb index bc25fce..880956a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,22 @@ # # movies = Movie.create([{ name: "Star Wars" }, { name: "Lord of the Rings" }]) # Character.create(name: "Luke", movie: movies.first) +Food.create(user_id:1, price:"$9", name:"Mashroom", measurement_unit:"1kg") +Food.create(user_id:1, price:"$5", name:"Tomato salads", measurement_unit:"2kg") +Food.create(user_id:1, price:"$3", name:"Cucumber", measurement_unit:"1kg") +Food.create(user_id:1, price:"$2", name:"Chicken soup", measurement_unit:"1kg") +Food.create(user_id:1, price:"$60", name:"Cake", measurement_unit:"8kg") +Food.create(user_id:1, price:"$30", name:"Fried rice", measurement_unit:"5kg") +Food.create(user_id:1, price:"$10", name:"Roasted meat", measurement_unit:"1kg") + +Recipe.create(name:"Nyama choma", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) +Recipe.create(name:"Chicken Shawama", preparation_time:"3 hours", cooking_time:"1 hour", description:"Tastes yummy", public:true, user_id:1) +Recipe.create(name:"Fried Rice", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) +Recipe.create(name:"French Rice", preparation_time:"1 hour", cooking_time:"2 hours", description:"Nice taste", public:true, user_id:1) +Recipe.create(name:"Eggs", preparation_time:"1 hour", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) +Recipe.create(name:"Chicken", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) + +RecipeFood.create(quantity:"10kg", food_id:1, recipe_id:1) + + + From 7b1e6787a3c0200f868ad6bc0fe64ac385d08da7 Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Tue, 17 May 2022 08:57:45 +0200 Subject: [PATCH 02/12] Created the views for recipe --- app/views/recipes/index.html.erb | 3 --- app/views/recipes/show.html.erb | 10 ++++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 app/views/recipes/show.html.erb diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index 425a00e..90496d5 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -6,11 +6,8 @@ <% @recipes.each do |recipe| %> <%= link_to recipe.name, recipe_path(recipe.id) %> <%= recipe.description %> - <%= recipe.preparation_time %> - <%= recipe.cooking_time %> <%= link_to "Delete", recipe_path(recipe.id), method: :delete, data: { confirm: "Are you sure?" } %> <%= link_to "Show", recipe_path(recipe.id) %> - <%= link_to "Back", recipes_path %> <% end %> diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb new file mode 100644 index 0000000..754f0f5 --- /dev/null +++ b/app/views/recipes/show.html.erb @@ -0,0 +1,10 @@ +
+
+

<%= @recipe.name %>

+
+

Preparation time: <%= @recipe.preparation_time %>

+

Cooking time: <%= @recipe.cooking_time %>

+
+
+
+ From 8a10543904462927c606790f038d64bf42b2f38c Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Tue, 17 May 2022 13:44:40 +0200 Subject: [PATCH 03/12] Created form for creating recipes --- app/controllers/recipes_controller.rb | 35 +++++++++++++++++++-------- app/models/inventory_food.rb | 3 --- app/models/recipe.rb | 2 ++ app/models/recipe_food.rb | 3 --- app/views/recipes/index.html.erb | 2 ++ app/views/recipes/new.html.erb | 17 +++++++++++++ config/database.yml | 2 ++ config/routes.rb | 2 +- db/seeds.rb | 14 +++++------ 9 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 app/views/recipes/new.html.erb diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 90c2f1a..6002fa4 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -1,6 +1,8 @@ class RecipesController < ApplicationController def index - @recipes = Recipe.all + @user = current_user + @recipes = @user.recipes.all + # @foods = Food.all end def show @@ -8,27 +10,40 @@ def show end def new - @recipe = Recipe.new + @user = current_user + @recipe = @user.recipes.new end def create - @recipe = Recipe.new(recipe_params) - if @recipe.save - redirect_to @recipe - else - render 'new' + @user = current_user + @recipe = @user.recipes.new(recipe_params) + respond_to do |format| + format.html do + if @recipe.save + flash[:success] = 'Recipe created successfully' + redirect_to recipes_url + else + flash.now[:error] = 'Error: Recipe could not be created' + render :new + end + end end end def destroy - @recipe = Recipe.find(params[:id]) + @user = current_user + @recipe = @user.recipes.find(params[:id]) @recipe.destroy - redirect_to recipes_path + + respond_to do |format| + format.html { redirect_to recipe_path, notice: 'Recipe was successfully destroyed.' } + format.json { head :no_content } + end end private def recipe_params - params.require(:recipe).permit(:name, :description, :user_id) + params.require(:recipe).permit(:name, :preparation_time, :cooking_time, :public, :description, :image) end end diff --git a/app/models/inventory_food.rb b/app/models/inventory_food.rb index ee1273d..60dda6f 100644 --- a/app/models/inventory_food.rb +++ b/app/models/inventory_food.rb @@ -1,7 +1,4 @@ class InventoryFood < ApplicationRecord belongs_to :food belongs_to :inventory - - validates :food_id, presence: true - validates :inventory_id, presence: true end diff --git a/app/models/recipe.rb b/app/models/recipe.rb index 1d8ec3f..7ca80ed 100644 --- a/app/models/recipe.rb +++ b/app/models/recipe.rb @@ -5,4 +5,6 @@ class Recipe < ApplicationRecord validates :name, presence: true validates :description, presence: true validates :user_id, presence: true + + has_one_attached :image end diff --git a/app/models/recipe_food.rb b/app/models/recipe_food.rb index 627482c..de4c992 100644 --- a/app/models/recipe_food.rb +++ b/app/models/recipe_food.rb @@ -1,7 +1,4 @@ class RecipeFood < ApplicationRecord belongs_to :recipe belongs_to :food - - validates :recipe_id, presence: true - validates :food_id, presence: true end diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index 90496d5..63580ae 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -2,6 +2,8 @@ <%= image_tag current_user.image.variant(resize_to_fill: [150, nil]) ? current_user.image : 'https://cdn.pixabay.com/photo/2016/04/01/10/11/avatar-1299805__340.png', class: "rounded-circle mr-2" if current_user %> +<%= link_to "Add Recipe", new_recipe_path(@recipes)%> + <% @recipes.each do |recipe| %> <%= link_to recipe.name, recipe_path(recipe.id) %> diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb new file mode 100644 index 0000000..01d3854 --- /dev/null +++ b/app/views/recipes/new.html.erb @@ -0,0 +1,17 @@ +<%= form_with model: @recipe do |f| %> +<%= f.label :image, "Image" %> +<%= f.file_field :image, class: 'form-control' %> + +<%= f.label :name, "Name" %> +<%= f.text_field :name, class: 'form-control' %> + +<%= f.label :preparation_time, "PreparationTime" %> +<%= f.text_field :preparation_time, class: 'form-control' %> + +<%= f.label :description, "Description" %> +<%= f.text_area :description, class: 'form-control' %> + +<%= f.label :cooking_time, "CookingTime" %> +<%= f.text_field :cooking_time, class: 'form-control' %> +<%= f.submit "Submit" %> +<% end %> \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index d62e4a8..c881034 100644 --- a/config/database.yml +++ b/config/database.yml @@ -60,6 +60,8 @@ development: test: <<: *default database: recipe_app_test + username: postgres + password: root # As with config/credentials.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is diff --git a/config/routes.rb b/config/routes.rb index 28c9336..59503e7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,7 +5,7 @@ # Defines the root path route ("/") # root "articles#index" root "recipes#index" - resources :recipes, only: [:index, :show, :new, :destroy] + resources :recipes, only: [:index, :show, :create, :new, :destroy] resources :foods, only: [:index, :show, :new, :destroy] resources :inventories, only: [:index, :show, :new, :destroy] get "/public_recipes", to: "recipes#public_recipes" diff --git a/db/seeds.rb b/db/seeds.rb index 880956a..80cf7e8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -13,14 +13,14 @@ Food.create(user_id:1, price:"$30", name:"Fried rice", measurement_unit:"5kg") Food.create(user_id:1, price:"$10", name:"Roasted meat", measurement_unit:"1kg") -Recipe.create(name:"Nyama choma", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) -Recipe.create(name:"Chicken Shawama", preparation_time:"3 hours", cooking_time:"1 hour", description:"Tastes yummy", public:true, user_id:1) -Recipe.create(name:"Fried Rice", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) -Recipe.create(name:"French Rice", preparation_time:"1 hour", cooking_time:"2 hours", description:"Nice taste", public:true, user_id:1) -Recipe.create(name:"Eggs", preparation_time:"1 hour", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) -Recipe.create(name:"Chicken", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) +# Recipe.create(name:"Nyama choma", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) +# Recipe.create(name:"Chicken Shawama", preparation_time:"3 hours", cooking_time:"1 hour", description:"Tastes yummy", public:true, user_id:1) +# Recipe.create(name:"Fried Rice", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) +# Recipe.create(name:"French Rice", preparation_time:"1 hour", cooking_time:"2 hours", description:"Nice taste", public:true, user_id:1) +# Recipe.create(name:"Eggs", preparation_time:"1 hour", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) +# Recipe.create(name:"Chicken", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) -RecipeFood.create(quantity:"10kg", food_id:1, recipe_id:1) +# RecipeFood.create(quantity:"10kg", food_id:1, recipe_id:1) From 67069893be30ac4b8a0aba8f4bd859ecb33cfe3d Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Tue, 17 May 2022 15:00:01 +0200 Subject: [PATCH 04/12] Add toggle public button --- app/controllers/recipes_controller.rb | 2 +- app/views/recipes/new.html.erb | 45 +++++++++++++++++---------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 6002fa4..43589f3 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -2,7 +2,6 @@ class RecipesController < ApplicationController def index @user = current_user @recipes = @user.recipes.all - # @foods = Food.all end def show @@ -12,6 +11,7 @@ def show def new @user = current_user @recipe = @user.recipes.new + # @foods = Food.find(current_user.id) end def create diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb index 01d3854..6fcc3a2 100644 --- a/app/views/recipes/new.html.erb +++ b/app/views/recipes/new.html.erb @@ -1,17 +1,30 @@ -<%= form_with model: @recipe do |f| %> -<%= f.label :image, "Image" %> -<%= f.file_field :image, class: 'form-control' %> +
+ <%= form_with model: @recipe do |f| %> +
+ <%= f.label :image, "Image" %> + <%= f.file_field :image, class: 'form-control' %> +
-<%= f.label :name, "Name" %> -<%= f.text_field :name, class: 'form-control' %> - -<%= f.label :preparation_time, "PreparationTime" %> -<%= f.text_field :preparation_time, class: 'form-control' %> - -<%= f.label :description, "Description" %> -<%= f.text_area :description, class: 'form-control' %> - -<%= f.label :cooking_time, "CookingTime" %> -<%= f.text_field :cooking_time, class: 'form-control' %> -<%= f.submit "Submit" %> -<% end %> \ No newline at end of file +
+ <%= f.label :is_public, "Public", class: "form-check-label" %> + <%= f.check_box :is_public, class: "form-check-input" %> +
+
+ <%= f.label :name, "Name" %> + <%= f.text_field :name, class: 'form-control' %> +
+
+ <%= f.label :preparation_time, "PreparationTime" %> + <%= f.text_field :preparation_time, class: 'form-control' %> +
+
+ <%= f.label :description, "Description" %> + <%= f.text_area :description, class: 'form-control' %> +
+
+ <%= f.label :cooking_time, "CookingTime" %> + <%= f.text_field :cooking_time, class: 'form-control' %> +
+ <%= f.submit "Submit" %> + <% end %> +
\ No newline at end of file From 998ac383835d9d633c8a033b0036783db577ae35 Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Tue, 17 May 2022 19:08:39 +0200 Subject: [PATCH 05/12] Add styles to recipe form --- app/assets/stylesheets/application.css | 5 +++ app/controllers/recipes_controller.rb | 5 ++- app/views/recipes/index.html.erb | 36 ++++++++------- app/views/recipes/new.html.erb | 61 +++++++++++++++----------- 4 files changed, 65 insertions(+), 42 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 14e2433..c50d8f9 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -117,3 +117,8 @@ td img { margin-left: auto; margin-right: auto; } + +.recipe-image { + width: 100%; + height: auto; +} diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 43589f3..a722a83 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -5,7 +5,8 @@ def index end def show - @recipe = Recipe.find(params[:id]) + @user = current_user + @recipe = @user.recipes.all end def new @@ -36,7 +37,7 @@ def destroy @recipe.destroy respond_to do |format| - format.html { redirect_to recipe_path, notice: 'Recipe was successfully destroyed.' } + format.html { redirect_to recipe_path, notice: 'Recipe was successfully deleted.' } format.json { head :no_content } end end diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index 8c55249..8cb5e82 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,20 +1,26 @@ -<<<<<<< HEAD -<%= button_to "Sign Out", destroy_user_session_path, method: 'delete', :"data-turbolinks" => false %> - -<%= image_tag current_user.image.variant(resize_to_fill: [150, nil]) ? current_user.image : 'https://cdn.pixabay.com/photo/2016/04/01/10/11/avatar-1299805__340.png', class: "rounded-circle mr-2" if current_user %> - +
+
List of Recipes
<%= link_to "Add Recipe", new_recipe_path(@recipes)%> +
+
+
+ <% @recipes.each do |recipe| %> + <% if recipe.image.present? %> + <%= image_tag recipe.image, class: "card-img-top" %> + <% else %> + <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "card-img-top recipe-image" %> + <% end %> + +
+
+
-<% @recipes.each do |recipe| %> - <%= link_to recipe.name, recipe_path(recipe.id) %> - <%= recipe.description %> - <%= link_to "Delete", recipe_path(recipe.id), method: :delete, data: { confirm: "Are you sure?" } %> - <%= link_to "Show", recipe_path(recipe.id) %> -<% end %> - -======= -

Recipes

->>>>>>> b64bec2501ef3e0f67ca41734935d1b755884f3f diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb index 6fcc3a2..f8bc16a 100644 --- a/app/views/recipes/new.html.erb +++ b/app/views/recipes/new.html.erb @@ -1,30 +1,41 @@ -
- <%= form_with model: @recipe do |f| %> -
- <%= f.label :image, "Image" %> - <%= f.file_field :image, class: 'form-control' %> -
+
+
+
+
+
+
Add recipe to your store
+ <%= form_with model: @recipe do |f| %> +
+ <%= f.file_field :image, class: 'form-control' %> + <%= f.label :image, 'Image if any', class: 'p-2' %> +
-
- <%= f.label :is_public, "Public", class: "form-check-label" %> - <%= f.check_box :is_public, class: "form-check-input" %> +
+ <%= f.label :is_public, "Make Public", class: "form-check-label p-2" %> + <%= f.check_box :is_public, class: "form-check-input p-2" %> +
+
+ <%= f.label :name, "Name" %> + <%= f.text_field :name, class: 'form-control' %> +
+
+ <%= f.label :preparation_time, "PreparationTime" %> + <%= f.text_field :preparation_time, class: 'form-control' %> +
+
+ <%= f.label :description, "Description" %> + <%= f.text_area :description, class: 'form-control' %> +
+
+ <%= f.label :cooking_time, "CookingTime" %> + <%= f.text_field :cooking_time, class: 'form-control' %> +
+
+ <%= f.submit '🥣 Add Food', class: "btn", style: "background-color: var(--primary-color); color: var(--white);", data: {disable_with: "Loading..."} %> +
+ <% end %> +
-
- <%= f.label :name, "Name" %> - <%= f.text_field :name, class: 'form-control' %> -
-
- <%= f.label :preparation_time, "PreparationTime" %> - <%= f.text_field :preparation_time, class: 'form-control' %> -
-
- <%= f.label :description, "Description" %> - <%= f.text_area :description, class: 'form-control' %>
-
- <%= f.label :cooking_time, "CookingTime" %> - <%= f.text_field :cooking_time, class: 'form-control' %>
- <%= f.submit "Submit" %> - <% end %>
\ No newline at end of file From 62c4dca3c5d8494e1b92f2ebb2d21ffb62f395c9 Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Wed, 18 May 2022 08:53:09 +0200 Subject: [PATCH 06/12] Created recipefood controller --- app/controllers/recipe_food_controller.rb | 44 +++++++++++++++++++ app/controllers/recipes_controller.rb | 7 ++- app/helpers/public_recipe_helper.rb | 2 + app/helpers/recipe_food_helper.rb | 2 + app/views/recipe_food/index.html.erb | 12 +++++ app/views/recipes/index.html.erb | 31 ++++++------- app/views/recipes/new.html.erb | 2 +- app/views/recipes/show.html.erb | 43 ++++++++++++++++-- db/seeds.rb | 17 +++---- .../public_recipe_controller_test.rb | 7 +++ .../recipe_food_controller_test.rb | 7 +++ 11 files changed, 141 insertions(+), 33 deletions(-) create mode 100644 app/controllers/recipe_food_controller.rb create mode 100644 app/helpers/public_recipe_helper.rb create mode 100644 app/helpers/recipe_food_helper.rb create mode 100644 app/views/recipe_food/index.html.erb create mode 100644 test/controllers/public_recipe_controller_test.rb create mode 100644 test/controllers/recipe_food_controller_test.rb diff --git a/app/controllers/recipe_food_controller.rb b/app/controllers/recipe_food_controller.rb new file mode 100644 index 0000000..9032ccb --- /dev/null +++ b/app/controllers/recipe_food_controller.rb @@ -0,0 +1,44 @@ +class RecipeFoodController < ApplicationController + before_action :authenticate_user! + + def index + @recipe_foods = RecipeFood.all + end + + def new + @recipe_food = RecipeFood.new + end + + def create + @recipe_food = RecipeFood.new(recipe_food_params) + + respond_to do |format| + format.html do + if @recipe_food.save + flash[:success] = 'Recipe created successfully' + redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) + else + flash.now[:error] = 'Error: Recipe could not be created' + render :new + end + end + end + end + + def destroy + @recipe_food = RecipeFood.find(params[:id]) + @recipe_food.destroy + respond_to do |format| + format.html do + flash[:success] = 'Recipe deleted successfully' + redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) + end + end + end + + private + + def recipe_food_params + params.require(:recipe_food).permit(:recipe_id, :food_id, :quantity) + end +end diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index a722a83..e3e95ac 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -1,18 +1,17 @@ class RecipesController < ApplicationController def index - @user = current_user - @recipes = @user.recipes.all + @recipes = Recipe.all.where(user_id: current_user).order(created_at: :desc).with_attached_image end def show @user = current_user - @recipe = @user.recipes.all + @recipe = @user.recipes.find(params[:id]) + @recipefoods = RecipeFood.all end def new @user = current_user @recipe = @user.recipes.new - # @foods = Food.find(current_user.id) end def create diff --git a/app/helpers/public_recipe_helper.rb b/app/helpers/public_recipe_helper.rb new file mode 100644 index 0000000..a172108 --- /dev/null +++ b/app/helpers/public_recipe_helper.rb @@ -0,0 +1,2 @@ +module PublicRecipeHelper +end diff --git a/app/helpers/recipe_food_helper.rb b/app/helpers/recipe_food_helper.rb new file mode 100644 index 0000000..71872bd --- /dev/null +++ b/app/helpers/recipe_food_helper.rb @@ -0,0 +1,2 @@ +module RecipeFoodHelper +end diff --git a/app/views/recipe_food/index.html.erb b/app/views/recipe_food/index.html.erb new file mode 100644 index 0000000..bc059df --- /dev/null +++ b/app/views/recipe_food/index.html.erb @@ -0,0 +1,12 @@ +

Recipe foods

+ +
+ <% @recipe_foods.each do |recipe_food| %> + <%= render recipe_food %> +

+ <%= link_to "Show this recipe food", recipe_food %> +

+ <% end %> +
+ +<%= link_to "New recipe food", new_recipe_food_path %> \ No newline at end of file diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index 8cb5e82..b1883dc 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,22 +1,19 @@
List of Recipes
-<%= link_to "Add Recipe", new_recipe_path(@recipes)%> -
-
-
- <% @recipes.each do |recipe| %> - <% if recipe.image.present? %> - <%= image_tag recipe.image, class: "card-img-top" %> - <% else %> - <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "card-img-top recipe-image" %> - <% end %> - +
+
+ <% @recipes.each do |recipe| %> + <% if recipe.image.present? %> + <%= image_tag recipe.image, class: "card-img-top" %> + <% else %> + <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "card-img-top recipe-image" %> + <% end %> +
diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb index f8bc16a..2dbc91a 100644 --- a/app/views/recipes/new.html.erb +++ b/app/views/recipes/new.html.erb @@ -4,7 +4,7 @@
Add recipe to your store
- <%= form_with model: @recipe do |f| %> + <%= form_with model: @recipe, url: recipes_path do |f| %>
<%= f.file_field :image, class: 'form-control' %> <%= f.label :image, 'Image if any', class: 'p-2' %> diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb index 754f0f5..35c7b57 100644 --- a/app/views/recipes/show.html.erb +++ b/app/views/recipes/show.html.erb @@ -1,10 +1,47 @@

<%= @recipe.name %>

-
-

Preparation time: <%= @recipe.preparation_time %>

-

Cooking time: <%= @recipe.cooking_time %>

+
+
+

Preparation time: <%= @recipe.preparation_time %>

+

Cooking time: <%= @recipe.cooking_time %>

+
+
+ + +
+ + + + + + + + + + + + + <% @recipefoods.includes(:food).each do |recipe_food| %> + + + + + + + + <% end %> + +
FoodNameQuantityValueAction
+ <% if recipe_food.food.image.present? %> + <%= image_tag recipe_food.food.image, class: "float-start bio-photo" %> + <% else %> + <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "bio-photo" %> + <% end %> + <%= recipe_food.food.name %><%= recipe_food.quantity %>$<%= recipe_food.food.price %> + Delete +
diff --git a/db/seeds.rb b/db/seeds.rb index 80cf7e8..00745a8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,13 +5,13 @@ # # movies = Movie.create([{ name: "Star Wars" }, { name: "Lord of the Rings" }]) # Character.create(name: "Luke", movie: movies.first) -Food.create(user_id:1, price:"$9", name:"Mashroom", measurement_unit:"1kg") -Food.create(user_id:1, price:"$5", name:"Tomato salads", measurement_unit:"2kg") -Food.create(user_id:1, price:"$3", name:"Cucumber", measurement_unit:"1kg") -Food.create(user_id:1, price:"$2", name:"Chicken soup", measurement_unit:"1kg") -Food.create(user_id:1, price:"$60", name:"Cake", measurement_unit:"8kg") -Food.create(user_id:1, price:"$30", name:"Fried rice", measurement_unit:"5kg") -Food.create(user_id:1, price:"$10", name:"Roasted meat", measurement_unit:"1kg") +# Food.create(user_id:1, price:"$9", name:"Mashroom", measurement_unit:"1kg") +# Food.create(user_id:1, price:"$5", name:"Tomato salads", measurement_unit:"2kg") +# Food.create(user_id:1, price:"$3", name:"Cucumber", measurement_unit:"1kg") +# Food.create(user_id:1, price:"$2", name:"Chicken soup", measurement_unit:"1kg") +# Food.create(user_id:1, price:"$60", name:"Cake", measurement_unit:"8kg") +# Food.create(user_id:1, price:"$30", name:"Fried rice", measurement_unit:"5kg") +# Food.create(user_id:1, price:"$10", name:"Roasted meat", measurement_unit:"1kg") # Recipe.create(name:"Nyama choma", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good food", public:true, user_id:1) # Recipe.create(name:"Chicken Shawama", preparation_time:"3 hours", cooking_time:"1 hour", description:"Tastes yummy", public:true, user_id:1) @@ -20,7 +20,8 @@ # Recipe.create(name:"Eggs", preparation_time:"1 hour", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) # Recipe.create(name:"Chicken", preparation_time:"2 hours", cooking_time:"1 hour", description:"Good taste", public:true, user_id:1) -# RecipeFood.create(quantity:"10kg", food_id:1, recipe_id:1) +RecipeFood.create(quantity:"10kg", food_id:1, recipe_id:1) + diff --git a/test/controllers/public_recipe_controller_test.rb b/test/controllers/public_recipe_controller_test.rb new file mode 100644 index 0000000..c2d7ff8 --- /dev/null +++ b/test/controllers/public_recipe_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class PublicRecipeControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/test/controllers/recipe_food_controller_test.rb b/test/controllers/recipe_food_controller_test.rb new file mode 100644 index 0000000..d43dcd0 --- /dev/null +++ b/test/controllers/recipe_food_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class RecipeFoodControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end From e3df7ef29b90a1e237c437914381a0eab9825af0 Mon Sep 17 00:00:00 2001 From: Samuel Mwape <43408618+Mwapsam@users.noreply.github.com> Date: Wed, 18 May 2022 09:44:27 +0200 Subject: [PATCH 07/12] Stytle recipe foods --- app/views/recipes/new.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb index 2dbc91a..77e5ad0 100644 --- a/app/views/recipes/new.html.erb +++ b/app/views/recipes/new.html.erb @@ -11,8 +11,8 @@
- <%= f.label :is_public, "Make Public", class: "form-check-label p-2" %> - <%= f.check_box :is_public, class: "form-check-input p-2" %> + <%= f.label :public, "Make Public", class: "form-check-label p-2" %> + <%= f.check_box :public, class: "form-check-input p-2" %>
<%= f.label :name, "Name" %> From 2c0a3e233cf2412a7f12c46bb072685ae424f4e5 Mon Sep 17 00:00:00 2001 From: clintonjosephs Date: Wed, 18 May 2022 10:55:30 +0100 Subject: [PATCH 08/12] remodelled styling for recipe list and form --- Gemfile | 2 +- Gemfile.lock | 2 +- app/assets/images/no-food-image.png | Bin 0 -> 4020 bytes app/assets/images/recipe-box-banner.jpeg | Bin 0 -> 78109 bytes app/assets/stylesheets/application.css | 12 +++++ app/controllers/recipes_controller.rb | 29 ++++++++--- app/models/ability.rb | 38 ++++++++++++++ app/models/recipe.rb | 5 +- app/views/recipes/index.html.erb | 30 ++++------- app/views/recipes/new.html.erb | 58 +++++++++++----------- app/views/shared/_recipe_display.html.erb | 21 ++++++++ config/database.yml | 8 +-- 12 files changed, 140 insertions(+), 65 deletions(-) create mode 100644 app/assets/images/no-food-image.png create mode 100644 app/assets/images/recipe-box-banner.jpeg create mode 100644 app/models/ability.rb create mode 100644 app/views/shared/_recipe_display.html.erb diff --git a/Gemfile b/Gemfile index 6617901..7e82c1b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '3.0.4' +ruby '3.0.1' # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem 'rails', '~> 7.0.2', '>= 7.0.2.3' diff --git a/Gemfile.lock b/Gemfile.lock index f8b5ee0..aab4a8a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -322,7 +322,7 @@ DEPENDENCIES webdrivers RUBY VERSION - ruby 3.0.4p208 + ruby 3.0.1p64 BUNDLED WITH 2.3.12 diff --git a/app/assets/images/no-food-image.png b/app/assets/images/no-food-image.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0e354e18851c21716d1e4131afad4602800124 GIT binary patch literal 4020 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/recipe-box-banner.jpeg b/app/assets/images/recipe-box-banner.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..daf4e4b8cfcbedad800f52ceab4c3e05cddd084f GIT binary patch literal 78109 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¥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

s5s6fc+KRwgt-jv`G7aS_fy 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 true + # + # See the wiki for details: + # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities + end +end \ No newline at end of file diff --git a/app/models/recipe.rb b/app/models/recipe.rb index 7ca80ed..4bc4262 100644 --- a/app/models/recipe.rb +++ b/app/models/recipe.rb @@ -2,9 +2,10 @@ class Recipe < ApplicationRecord belongs_to :user has_many :recipe_foods, dependent: :destroy - validates :name, presence: true - validates :description, presence: true + validates :name, presence: true, length: { maximum: 100 } validates :user_id, presence: true + validates :preparation_time, presence: true + validates :cooking_time, presence: true has_one_attached :image end diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index b1883dc..da0b476 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,22 +1,14 @@ -

-
List of Recipes
-
-
- <% @recipes.each do |recipe| %> - <% if recipe.image.present? %> - <%= image_tag recipe.image, class: "card-img-top" %> - <% else %> - <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "card-img-top recipe-image" %> - <% end %> - -
-
+ +
Your Recipies
+
+
+ <% @recipes.each do |recipe| %> + <%= render partial: "shared/recipe_display", locals: {recipe: recipe} %> + <% end %> +
+ + + diff --git a/app/views/recipes/new.html.erb b/app/views/recipes/new.html.erb index 77e5ad0..ae81a38 100644 --- a/app/views/recipes/new.html.erb +++ b/app/views/recipes/new.html.erb @@ -1,41 +1,39 @@ -
-
-
-
-
-
Add recipe to your store
- <%= form_with model: @recipe, url: recipes_path do |f| %> -
- <%= f.file_field :image, class: 'form-control' %> - <%= f.label :image, 'Image if any', class: 'p-2' %> -
- -
- <%= f.label :public, "Make Public", class: "form-check-label p-2" %> - <%= f.check_box :public, class: "form-check-input p-2" %> -
+
+
+ <%= image_tag("recipe-box-banner.jpeg", class: "card-img-top") %> +
+
😊 Create a new recipe!!
+

Would'nt it be nice to store a recipe of your favourite food? Go ahead!

+ <%= form_with model: @recipe, url: recipes_path do |f| %> +
+ <%= f.file_field :image, class: 'form-control' %> + <%= f.label :image, 'Choose an image that would appear as banner for recipe', class: 'mb-2' %> +
- <%= f.label :name, "Name" %> - <%= f.text_field :name, class: 'form-control' %> + <%= f.text_field :name, class: 'form-control', required: true %> + <%= f.label :name, "Recipe Name*" %>
- <%= f.label :preparation_time, "PreparationTime" %> - <%= f.text_field :preparation_time, class: 'form-control' %> + <%= f.number_field :preparation_time, class: 'form-control', required: true %> + <%= f.label :preparation_time, "Preparation Time in mins*" %>
- <%= f.label :description, "Description" %> - <%= f.text_area :description, class: 'form-control' %> + <%= f.number_field :cooking_time, class: 'form-control', required: true %> + <%= f.label :cooking_time, "Cooking Time in mins*" %>
- <%= f.label :cooking_time, "CookingTime" %> - <%= f.text_field :cooking_time, class: 'form-control' %> + <%= f.text_area :description, class: 'form-control' %> + <%= f.label :description, "Description" %> +
+
+ <%= f.check_box :public, class: "form-check-input" %> + <%= f.label :public, 'Mark public', class: "form-check-label" %>
+ This allows other users to see your recipe
-
- <%= f.submit '🥣 Add Food', class: "btn", style: "background-color: var(--primary-color); color: var(--white);", data: {disable_with: "Loading..."} %> -
- <% end %> -
+
+ <%= f.submit '🥣 Create Recipe', class: "btn", style: "background-color: var(--primary-color); color: var(--white);", data: {disable_with: "Loading..."} %> +
+ <% end %>
-
\ No newline at end of file diff --git a/app/views/shared/_recipe_display.html.erb b/app/views/shared/_recipe_display.html.erb new file mode 100644 index 0000000..7b98d6a --- /dev/null +++ b/app/views/shared/_recipe_display.html.erb @@ -0,0 +1,21 @@ +
+
+
+ <% if recipe.image.present? %> + <%= image_tag recipe.image, class: "card-img-top" %> + <% else %> + <%= image_tag "no-food-image.png", class: "card-img-top recipe-image" %> + <% end %> +
+
+
+
<%= recipe.name %>
+

<%= recipe.description.length < 54 ? recipe.description : truncate(recipe.description, length: 100, omission: '...') %>

+

+ <%= link_to ' Show'.html_safe, recipe_path(recipe.id), class: 'btn btn-outline-info' %> + <%= link_to ' Delete'.html_safe, recipe_path(recipe.id), method: :delete, data: { confirm: "Delete recipe #{recipe.name}?" }, class: 'btn btn-outline-danger' if can? :destroy, recipe %> +

+
+
+
+
\ No newline at end of file diff --git a/config/database.yml b/config/database.yml index c881034..2906656 100644 --- a/config/database.yml +++ b/config/database.yml @@ -24,8 +24,8 @@ default: &default development: <<: *default database: recipe_app_development - username: postgres - password: root + # username: postgres + # password: root # The specified database role being used to connect to postgres. # To create additional roles in postgres see `$ createuser --help`. @@ -60,8 +60,8 @@ development: test: <<: *default database: recipe_app_test - username: postgres - password: root + # username: postgres + # password: root # As with config/credentials.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is From a56ab06f99dcab585275af08a12c648b333f13bc Mon Sep 17 00:00:00 2001 From: clintonjosephs Date: Wed, 18 May 2022 12:37:19 +0100 Subject: [PATCH 09/12] restyled recipe details page --- ...ntroller.rb => recipe_foods_controller.rb} | 2 +- app/controllers/recipes_controller.rb | 15 ++++-- app/views/recipes/index.html.erb | 2 +- app/views/recipes/public_recipes.html.erb | 1 + app/views/recipes/show.html.erb | 49 ++++++++++++------- app/views/shared/_recipe_display.html.erb | 3 ++ config/routes.rb | 6 ++- 7 files changed, 54 insertions(+), 24 deletions(-) rename app/controllers/{recipe_food_controller.rb => recipe_foods_controller.rb} (95%) create mode 100644 app/views/recipes/public_recipes.html.erb diff --git a/app/controllers/recipe_food_controller.rb b/app/controllers/recipe_foods_controller.rb similarity index 95% rename from app/controllers/recipe_food_controller.rb rename to app/controllers/recipe_foods_controller.rb index 9032ccb..4d26dac 100644 --- a/app/controllers/recipe_food_controller.rb +++ b/app/controllers/recipe_foods_controller.rb @@ -1,4 +1,4 @@ -class RecipeFoodController < ApplicationController +class RecipeFoodsController < ApplicationController before_action :authenticate_user! def index diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index 87d2627..bdb5af7 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -7,9 +7,11 @@ def index end def show - @user = current_user - @recipe = @user.recipes.find(params[:id]) - @recipefoods = RecipeFood.all + data = Recipe.where(id: params[:id]).with_attached_image + @recipe = data[0] + @recipe_foods = Food.all.joins('INNER JOIN recipe_foods ON foods.id = recipe_foods.food_id') + .order(created_at: :desc).select('foods.*, recipe_foods.quantity, recipe_foods.id as recipe_foods_id') + .where(recipe_foods: { recipe_id: params[:id] }).with_attached_image end def new @@ -17,6 +19,10 @@ def new @recipe = @user.recipes.new end + def update + Recipe.find(params[:id]).update(public: params[:recipe][:public]) + end + def create @user = current_user @recipe = @user.recipes.new(recipe_params) @@ -54,6 +60,9 @@ def destroy redirect_to recipes_url end + def public_recipes + end + private def recipe_params diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index da0b476..b3ee5d8 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,5 +1,5 @@ -
Your Recipies
+
Your Recipies

<% @recipes.each do |recipe| %> diff --git a/app/views/recipes/public_recipes.html.erb b/app/views/recipes/public_recipes.html.erb new file mode 100644 index 0000000..5784afa --- /dev/null +++ b/app/views/recipes/public_recipes.html.erb @@ -0,0 +1 @@ +

Public recipies

\ No newline at end of file diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb index 35c7b57..5297ca7 100644 --- a/app/views/recipes/show.html.erb +++ b/app/views/recipes/show.html.erb @@ -1,21 +1,36 @@ +<%= link_to ' << Public Recipes', public_recipes_path, class: "btn btn-outline mb-2"%> +<%= link_to ' << Recipes', recipes_path, class: "btn btn-outline mb-2" if current_user %>
-

<%= @recipe.name %>

-
-
-

Preparation time: <%= @recipe.preparation_time %>

-

Cooking time: <%= @recipe.cooking_time %>

-
-
- - -
+

+ <%= image_tag @recipe.image, class: "float-start bio-photo" if @recipe.image.present? %> + <%= @recipe.name %> +

+
+
+

Preparation time: <%= @recipe.preparation_time %>

+

Cooking time: <%= @recipe.cooking_time %>

+
+
+ <%= form_with model: @recipe, url: recipe_path(@recipe.id), method: :patch, local: true do |form| %> +
+ <%= form.check_box :public, class: "form-check-input", onchange: 'this.form.submit()' %> + <%= form.label :public, 'public', class: "form-check-label", checked: @recipe.public %>
+
+ <% end %> +
- +
+ <%= link_to 'Generate shopping list', new_recipe_recipe_food_path(@recipe.id), class: "btn btn-outline-info mb-2 flex-start" %> + + <%= link_to ' Add food ingredient'.html_safe, new_recipe_recipe_food_path(@recipe.id), class: "btn btn-outline-success mb-2 flex-end" %> + +
+ @@ -24,18 +39,18 @@ - <% @recipefoods.includes(:food).each do |recipe_food| %> + <% @recipe_foods.each do |recipe_food| %> - + - + diff --git a/app/views/shared/_recipe_display.html.erb b/app/views/shared/_recipe_display.html.erb index 7b98d6a..d489c49 100644 --- a/app/views/shared/_recipe_display.html.erb +++ b/app/views/shared/_recipe_display.html.erb @@ -15,6 +15,9 @@ <%= link_to ' Show'.html_safe, recipe_path(recipe.id), class: 'btn btn-outline-info' %> <%= link_to ' Delete'.html_safe, recipe_path(recipe.id), method: :delete, data: { confirm: "Delete recipe #{recipe.name}?" }, class: 'btn btn-outline-danger' if can? :destroy, recipe %>

+ <% if current_user %> + <%= recipe.public ? ''.html_safe : '' %> + <% end %> diff --git a/config/routes.rb b/config/routes.rb index 2011d7c..7d2880f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,8 +4,10 @@ # Defines the root path route ("/") # root "articles#index" - root "recipes#index" - resources :recipes, only: [:index, :show, :new, :destroy, :create] + root "recipes#public_recipes" + resources :recipes, only: [:index, :show, :new, :destroy, :create, :update] do + resources :recipe_foods, only: [:new, :create, :destroy] + end resources :foods, only: [:index, :show, :new, :destroy, :create] resources :inventories, only: [:index, :show, :new, :destroy, :create] get "/public_recipes", to: "recipes#public_recipes" From 33e59d4a9d1c53ab4d24659ad2e6dbb33ba65ca8 Mon Sep 17 00:00:00 2001 From: clintonjosephs Date: Wed, 18 May 2022 13:18:55 +0100 Subject: [PATCH 10/12] implemented adding food to recipe module --- app/controllers/recipe_foods_controller.rb | 61 ++++++++++++---------- app/models/recipe_food.rb | 4 ++ app/views/recipe_food/index.html.erb | 12 ----- app/views/recipe_foods/new.html.erb | 22 ++++++++ app/views/recipes/index.html.erb | 2 +- app/views/recipes/show.html.erb | 19 ++++--- 6 files changed, 69 insertions(+), 51 deletions(-) delete mode 100644 app/views/recipe_food/index.html.erb create mode 100644 app/views/recipe_foods/new.html.erb diff --git a/app/controllers/recipe_foods_controller.rb b/app/controllers/recipe_foods_controller.rb index 4d26dac..b2d2421 100644 --- a/app/controllers/recipe_foods_controller.rb +++ b/app/controllers/recipe_foods_controller.rb @@ -1,44 +1,49 @@ class RecipeFoodsController < ApplicationController - before_action :authenticate_user! + load_and_authorize_resource + before_action :authenticate_user! - def index - @recipe_foods = RecipeFood.all - end - def new - @recipe_food = RecipeFood.new + setup end def create - @recipe_food = RecipeFood.new(recipe_food_params) - - respond_to do |format| - format.html do - if @recipe_food.save - flash[:success] = 'Recipe created successfully' - redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) - else - flash.now[:error] = 'Error: Recipe could not be created' - render :new - end - end + setup + recipe_food = RecipeFood.new(recipe_food_params) + recipe_food.recipe_id = params[:recipe_id] + if recipe_food.save + flash[:success] = 'Food was successfully added to recipe.' + else + flash[:danger] = 'Food was not added to recipe because
    ' + recipe_food.errors.full_messages.each do |msg| + flash[:danger] += "
  • #{msg}
  • " end + flash[:danger] += '
' + end + redirect_to new_recipe_recipe_food_path(params[:recipe_id]) end - def destroy - @recipe_food = RecipeFood.find(params[:id]) - @recipe_food.destroy - respond_to do |format| - format.html do - flash[:success] = 'Recipe deleted successfully' - redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) - end - end + # def destroy + # @recipe_food = RecipeFood.find(params[:id]) + # @recipe_food.destroy + # respond_to do |format| + # format.html do + # flash[:success] = 'Recipe deleted successfully' + # redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) + # end + # end + # end + + def setup + @recipe_food = RecipeFood.new + @recipe_food_ids = RecipeFood.all.where(recipe_id: params[:recipe_id]).pluck(:food_id) + @foods = Food.all.where(user_id: current_user.id).where.not(id: @recipe_food_ids).order(name: :asc) + @recipe = Recipe.find(params[:recipe_id]) end + private def recipe_food_params - params.require(:recipe_food).permit(:recipe_id, :food_id, :quantity) + params.require(:recipe_food).permit(:food_id, :quantity) end end diff --git a/app/models/recipe_food.rb b/app/models/recipe_food.rb index de4c992..2b8220e 100644 --- a/app/models/recipe_food.rb +++ b/app/models/recipe_food.rb @@ -1,4 +1,8 @@ class RecipeFood < ApplicationRecord belongs_to :recipe belongs_to :food + + validates :recipe_id, presence: true + validates :food_id, presence: true + validates :quantity, presence: true, numericality: { greater_than: 0 } end diff --git a/app/views/recipe_food/index.html.erb b/app/views/recipe_food/index.html.erb deleted file mode 100644 index bc059df..0000000 --- a/app/views/recipe_food/index.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -

Recipe foods

- -
- <% @recipe_foods.each do |recipe_food| %> - <%= render recipe_food %> -

- <%= link_to "Show this recipe food", recipe_food %> -

- <% end %> -
- -<%= link_to "New recipe food", new_recipe_food_path %> \ No newline at end of file diff --git a/app/views/recipe_foods/new.html.erb b/app/views/recipe_foods/new.html.erb new file mode 100644 index 0000000..49881c8 --- /dev/null +++ b/app/views/recipe_foods/new.html.erb @@ -0,0 +1,22 @@ +<%= link_to ' << Recipe', recipe_path(@recipe.id), class: "btn btn-outline-success mb-5" %> +
+
+
+
Add Ingredient to <%= @recipe.name %>
+ <%= form_with model: @recipe_food, url: recipe_recipe_foods_path, local: true do |form| %> +
+ <%= form.select :food_id, @foods.map { |food| [food.name, food.id] }, {:include_blank => "-", :required => true}, {:class => 'form-control'} %> + <%= form.label :food_id, "Choose food from the list to add *" %> +
+
+ <%= form.number_field :quantity, class: "form-control", required: true %> + <%= form.label :quantity, "Quantity *" %> +
+
+ <%= form.submit 'Add Ingredient to recipe', class: "btn btn-primary", data: {disable_with: "Loading..."} %> +
+ <% end %> +

Updating as <%= current_user.name %>

+
+
+
diff --git a/app/views/recipes/index.html.erb b/app/views/recipes/index.html.erb index b3ee5d8..57d436d 100644 --- a/app/views/recipes/index.html.erb +++ b/app/views/recipes/index.html.erb @@ -1,5 +1,5 @@ -
Your Recipies
+
Your Recipies (<%= @recipes.length %>)

<% @recipes.each do |recipe| %> diff --git a/app/views/recipes/show.html.erb b/app/views/recipes/show.html.erb index 5297ca7..f2aeffc 100644 --- a/app/views/recipes/show.html.erb +++ b/app/views/recipes/show.html.erb @@ -30,9 +30,8 @@
# Food Name Quantity
- <% if recipe_food.food.image.present? %> - <%= image_tag recipe_food.food.image, class: "float-start bio-photo" %> + <% if recipe_food.image.present? %> + <%= image_tag recipe_food.image, class: "float-start bio-photo" %> <% else %> - <%= image_tag "https://nuwaay.com/wp-content/uploads/2022/01/default_256.png", class: "bio-photo" %> + <%= image_tag "no-food-image.png", class: "bio-photo" %> <% end %> <%= recipe_food.food.name %><%= recipe_food.name %> <%= recipe_food.quantity %>$<%= recipe_food.food.price %>$<%= recipe_food.price %> Delete
- + - @@ -41,18 +40,18 @@ <% @recipe_foods.each do |recipe_food| %> - + <% end %> + - + <% end %> From 8443b2c75792343c59db753e27fbeefe94a639e9 Mon Sep 17 00:00:00 2001 From: clintonjosephs Date: Wed, 18 May 2022 14:35:30 +0100 Subject: [PATCH 11/12] fixed linters errors --- app/assets/stylesheets/application.css | 2 +- app/controllers/publics_controller.rb | 3 + app/controllers/recipe_foods_controller.rb | 97 ++++++++++++------- app/controllers/recipes_controller.rb | 5 +- app/models/ability.rb | 2 +- app/views/layouts/application.html.erb | 4 +- app/views/publics/index.html.erb | 1 + app/views/recipe_foods/edit.html.erb | 1 + app/views/recipe_foods/new.html.erb | 23 +---- app/views/recipes/public_recipes.html.erb | 1 - app/views/recipes/show.html.erb | 9 +- app/views/shared/_recipe_food_form.html.erb | 34 +++++++ config/routes.rb | 7 +- .../public_recipe_controller_test.rb | 2 +- .../recipe_food_controller_test.rb | 2 +- 15 files changed, 118 insertions(+), 75 deletions(-) create mode 100644 app/controllers/publics_controller.rb create mode 100644 app/views/publics/index.html.erb create mode 100644 app/views/recipe_foods/edit.html.erb delete mode 100644 app/views/recipes/public_recipes.html.erb create mode 100644 app/views/shared/_recipe_food_form.html.erb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 6c32001..414c230 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -133,4 +133,4 @@ td img { .recipe-card { border-radius: 0 !important; padding: 4px; -} \ No newline at end of file +} diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb new file mode 100644 index 0000000..fb1ae66 --- /dev/null +++ b/app/controllers/publics_controller.rb @@ -0,0 +1,3 @@ +class PublicsController < ApplicationController + def index; end +end diff --git a/app/controllers/recipe_foods_controller.rb b/app/controllers/recipe_foods_controller.rb index b2d2421..044c638 100644 --- a/app/controllers/recipe_foods_controller.rb +++ b/app/controllers/recipe_foods_controller.rb @@ -1,49 +1,72 @@ class RecipeFoodsController < ApplicationController load_and_authorize_resource before_action :authenticate_user! - - def new - setup - end - def create - setup - recipe_food = RecipeFood.new(recipe_food_params) - recipe_food.recipe_id = params[:recipe_id] - if recipe_food.save - flash[:success] = 'Food was successfully added to recipe.' - else - flash[:danger] = 'Food was not added to recipe because
    ' - recipe_food.errors.full_messages.each do |msg| - flash[:danger] += "
  • #{msg}
  • " - end - flash[:danger] += '
' + def new + setup + end + + def edit + setup + @recipe_food = RecipeFood.find(params[:id]) + end + + def create + setup + recipe_food = RecipeFood.new(recipe_food_params) + recipe_food.recipe_id = params[:recipe_id] + if recipe_food.save + flash[:success] = 'Food was successfully added to recipe.' + else + flash[:danger] = 'Food was not added to recipe because
    ' + recipe_food.errors.full_messages.each do |msg| + flash[:danger] += "
  • #{msg}
  • " end - redirect_to new_recipe_recipe_food_path(params[:recipe_id]) + flash[:danger] += '
' end + redirect_to new_recipe_recipe_food_path(params[:recipe_id]) + end - # def destroy - # @recipe_food = RecipeFood.find(params[:id]) - # @recipe_food.destroy - # respond_to do |format| - # format.html do - # flash[:success] = 'Recipe deleted successfully' - # redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) - # end - # end - # end - - def setup - @recipe_food = RecipeFood.new - @recipe_food_ids = RecipeFood.all.where(recipe_id: params[:recipe_id]).pluck(:food_id) - @foods = Food.all.where(user_id: current_user.id).where.not(id: @recipe_food_ids).order(name: :asc) - @recipe = Recipe.find(params[:recipe_id]) + def destroy + @recipe_food = RecipeFood.find(params[:id]) + @recipe_food.destroy + respond_to do |format| + format.html do + flash[:success] = 'Recipe food deleted successfully' + redirect_back_or_to({ action: 'show', id: params[:recipe_id] }) + end end - + end - private + def update + recipe_food = RecipeFood.find(params[:id]) - def recipe_food_params - params.require(:recipe_food).permit(:food_id, :quantity) + if recipe_food.update(recipe_food_update) + flash[:success] = "quantity for #{recipe_food.food.name} was successfully updated." + else + flash[:danger] = 'operation failed
    ' + recipe_food.errors.full_messages.each do |msg| + flash[:danger] += "
  • #{msg}
  • " + end + flash[:danger] += '
' end + redirect_to recipe_path(params[:recipe_id]) + end + + def setup + @recipe_food = RecipeFood.new + @recipe_food_ids = RecipeFood.all.where(recipe_id: params[:recipe_id]).pluck(:food_id) + @foods = Food.all.where(user_id: current_user.id).where.not(id: @recipe_food_ids).order(name: :asc) + @recipe = Recipe.find(params[:recipe_id]) + end + + private + + def recipe_food_params + params.require(:recipe_food).permit(:food_id, :quantity) + end + + def recipe_food_update + params.require(:recipe_food).permit(:quantity) + end end diff --git a/app/controllers/recipes_controller.rb b/app/controllers/recipes_controller.rb index bdb5af7..49410e7 100644 --- a/app/controllers/recipes_controller.rb +++ b/app/controllers/recipes_controller.rb @@ -1,5 +1,5 @@ class RecipesController < ApplicationController - before_action :authenticate_user! + before_action :authenticate_user!, except: [:public_recipes] load_and_authorize_resource def index @@ -60,9 +60,6 @@ def destroy redirect_to recipes_url end - def public_recipes - end - private def recipe_params diff --git a/app/models/ability.rb b/app/models/ability.rb index b69e3fb..3340bab 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -35,4 +35,4 @@ def initialize(user) # See the wiki for details: # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities end -end \ No newline at end of file +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4739035..a0aa37d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -15,14 +15,14 @@
<% end %> diff --git a/app/views/shared/_recipe_food_form.html.erb b/app/views/shared/_recipe_food_form.html.erb new file mode 100644 index 0000000..b8b0599 --- /dev/null +++ b/app/views/shared/_recipe_food_form.html.erb @@ -0,0 +1,34 @@ +<%= link_to ' << Recipe', recipe_path(recipe.id), class: "btn btn-outline-success mb-5" %> +
+
+
+ <% if type != 'edit' %> +
Add Ingredient to <%= recipe.name %>
+ <% else %> +
Updating <%= recipe_food.food.name %> in <%= recipe.name %>
+ <% end %> + <%= form_with model: recipe_food, url: url, method: method, local: true do |form| %> + <% if type != 'edit' %> +
+ <%= form.select :food_id, foods.map { |food| [food.name, food.id] }, {:include_blank => "-", :required => true}, {:class => 'form-control'} %> + <%= form.label :food_id, "Choose food from the list to add *" %> +
+ <% end %> +
+ <%= form.number_field :quantity, class: "form-control", required: true %> + <%= form.label :quantity, "Quantity *" %> +
+ <% if type != 'edit' %> +
+ <%= form.submit 'Add Ingredient to recipe', class: "btn btn-primary", data: {disable_with: "Loading..."} %> +
+ <% else %> +
+ <%= form.submit "Update #{recipe_food.food.name}", class: "btn btn-primary", data: {disable_with: "Loading..."} %> +
+ <% end %> + <% end %> +

Updating as <%= current_user.name %>

+
+
+
diff --git a/config/routes.rb b/config/routes.rb index 7d2880f..a65c140 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,12 +4,11 @@ # Defines the root path route ("/") # root "articles#index" - root "recipes#public_recipes" + root "publics#index" resources :recipes, only: [:index, :show, :new, :destroy, :create, :update] do - resources :recipe_foods, only: [:new, :create, :destroy] + resources :recipe_foods, only: [:new, :create, :destroy, :edit, :update] end resources :foods, only: [:index, :show, :new, :destroy, :create] resources :inventories, only: [:index, :show, :new, :destroy, :create] - get "/public_recipes", to: "recipes#public_recipes" - get "/general_shopping_list", to: "foods#general_shopping_list" + resources :publics, only: [:index] end diff --git a/test/controllers/public_recipe_controller_test.rb b/test/controllers/public_recipe_controller_test.rb index c2d7ff8..3ac7701 100644 --- a/test/controllers/public_recipe_controller_test.rb +++ b/test/controllers/public_recipe_controller_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require 'test_helper' class PublicRecipeControllerTest < ActionDispatch::IntegrationTest # test "the truth" do diff --git a/test/controllers/recipe_food_controller_test.rb b/test/controllers/recipe_food_controller_test.rb index d43dcd0..59fdc3e 100644 --- a/test/controllers/recipe_food_controller_test.rb +++ b/test/controllers/recipe_food_controller_test.rb @@ -1,4 +1,4 @@ -require "test_helper" +require 'test_helper' class RecipeFoodControllerTest < ActionDispatch::IntegrationTest # test "the truth" do From 38c69540e3647e70e44bd5cd7b2ad24e9aa33288 Mon Sep 17 00:00:00 2001 From: clintonjosephs Date: Wed, 18 May 2022 15:22:17 +0100 Subject: [PATCH 12/12] fixed stylint errors --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e9b1402..d5fb218 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -140,7 +140,7 @@ td img { border-radius: 0 !important; padding: 4px; } - + .shadow { -moz-box-shadow: 0 0 3px #ccc !important; -webkit-box-shadow: 0 0 3px #ccc !important;
## FoodName Quantity Value Action
- <% if recipe_food.image.present? %> - <%= image_tag recipe_food.image, class: "float-start bio-photo" %> - <% else %> + + <% if recipe_food.image.present? %> + <%= image_tag recipe_food.image, class: "bio-photo" %> + <% else %> <%= image_tag "no-food-image.png", class: "bio-photo" %> - <% end %> - <%= recipe_food.name %> <%= recipe_food.quantity %>$<%= recipe_food.price %>$<%= recipe_food.price * recipe_food.quantity %> - Delete + Delete
<%= recipe_food.quantity %> $<%= recipe_food.price * recipe_food.quantity %> - Delete + + + Modify + + + + Delete +