Skip to content

Commit

Permalink
Merge pull request #87 from motohiro-mm/fix/change_number_of_meals_cr…
Browse files Browse the repository at this point in the history
…eated

nameもmemoもないmealは作成されないように変更した
  • Loading branch information
motohiro-mm authored Oct 1, 2024
2 parents ce71e6d + d33c606 commit 7091493
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 12 deletions.
2 changes: 1 addition & 1 deletion app/controllers/meal_plans_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def new
end

def edit
@meal_plan.meals_build if @meal_plan.meals.blank?
@meal_plan.meals_build
end

def create
Expand Down
41 changes: 32 additions & 9 deletions app/models/meal_plan.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,49 @@ class MealPlan < ApplicationRecord

validates :meal_date, presence: true, uniqueness: { scope: :family_id }

accepts_nested_attributes_for :meals, allow_destroy: true
accepts_nested_attributes_for :meals, allow_destroy: true, reject_if: :reject_timing

def reject_timing(attributes)
attributes.except(:timing).values.all?(&:blank?)
end

def update_meal_plan(attributes)
if attributes[:meals_attributes].keys.size == 1
meals_create if meals.blank?
new_meal_params = attributes[:meals_attributes]['0']
update_meal = meals.find_by(timing: new_meal_params[:timing])
update_meal.name = new_meal_params[:name]
update_meal.save
create_or_update_meals_by_proposal(attributes)
else
update(attributes)
destroy_unnecessary_meals(attributes)
end
end

def create_or_update_meals_by_proposal(attributes)
new_meal_params = attributes[:meals_attributes]['0']
same_timing_meal = meals.find_by(timing: new_meal_params[:timing])
if same_timing_meal.nil?
meals.create(new_meal_params)
else
same_timing_meal.name = new_meal_params[:name]
same_timing_meal.save
end
end

def destroy_unnecessary_meals(attributes)
attributes[:meals_attributes].each_value do |update_meal|
if update_meal[:id].present? && update_meal.except(:id, :timing).values.all?(&:blank?)
meals.find(update_meal[:id]).destroy
end
end
end

def meals_build
3.times { meals.build }
required_timings = Meal.timings.keys - meals.pluck(:timing)
required_timings.each do |required_timing|
meals.build(timing: required_timing)
end
end

def meals_create
3.times { |n| meals.create(timing: Meal.timings.keys[n]) }
def meals_sort_by_timing
meals.sort_by { |meal| Meal.timings[meal.timing] }
end

def start_time
Expand Down
2 changes: 1 addition & 1 deletion app/views/meal_plans/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<%= form.hidden_field :meal_date %>
</div>

<%= form.fields_for :meals do |meal_form| %>
<%= form.fields_for :meals, meal_plan.meals_sort_by_timing do |meal_form| %>
<div class="<%= meal_timing(meal_form) %>">
<strong><%= meal_timing(meal_form) %></strong>
<%= meal_form.hidden_field :timing, value: meal_timing(meal_form) %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/meal_plans/_meal_plan.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<h2 class="font-bold text-3xl text-stone-800"><%= meal_plan.meal_date %></h2>

<% @meal_plan.meals.sort_by(&:timing_before_type_cast).each do |meal| %>
<% @meal_plan.meals_sort_by_timing.each do |meal| %>
<%= render 'meals/meal', meal: %>
<% end %>
</div>

0 comments on commit 7091493

Please sign in to comment.