diff --git a/app/controllers/meals_controller.rb b/app/controllers/meals_controller.rb index 3bc20be..636257e 100644 --- a/app/controllers/meals_controller.rb +++ b/app/controllers/meals_controller.rb @@ -19,6 +19,14 @@ class MealsController < ApplicationController end def create + @meal = @project.meals.new(meal_params) + if @meal.save + flash[:notice] = 'Created new meal' + prepare_meals + else + @meal.ingredients.new if @meal.ingredients.empty? + render :new + end end def destroy @@ -26,6 +34,19 @@ class MealsController < ApplicationController private + def meal_params + params.require(:meal).permit( + :notes, + ingredients_attributes: + [ + :id, + :food_id, + :amount, + :_destroy + ] + ) + end + def prepare_meals @meals = @project.meals.includes(:foods) end diff --git a/app/models/ingredient.rb b/app/models/ingredient.rb index ae9a171..e7e47cf 100644 --- a/app/models/ingredient.rb +++ b/app/models/ingredient.rb @@ -1,8 +1,14 @@ class Ingredient < ActiveRecord::Base - belongs_to :composition, inverse_of: :ingredients, required: true + belongs_to :composition, inverse_of: :ingredients, polymorphic: true, required: true belongs_to :food, required: true belongs_to :part_of, required: false validates :ready_ratio, numericality: {greater_than_or_equal_to: 0.0} validates :amount, numericality: {greater_than_or_equal_to: 0.0} + + after_initialize do + if new_record? + self.ready_ratio ||= BigDecimal.new('1.0') + end + end end diff --git a/app/models/meal.rb b/app/models/meal.rb index 9fea6ae..c36ade4 100644 --- a/app/models/meal.rb +++ b/app/models/meal.rb @@ -1,7 +1,8 @@ class Meal < ActiveRecord::Base belongs_to :project, required: true - has_many :ingredients, as: :composition, dependent: :destroy, validate: true + has_many :ingredients, as: :composition, inverse_of: :composition, dependent: :destroy, + validate: true has_many :foods, through: :ingredients validates :ingredients, presence: true accepts_nested_attributes_for :ingredients, allow_destroy: true, reject_if: proc { |attrs| diff --git a/app/views/meals/_form.html.erb b/app/views/meals/_form.html.erb index 7caf05f..ef41a92 100644 --- a/app/views/meals/_form.html.erb +++ b/app/views/meals/_form.html.erb @@ -10,10 +10,11 @@

<%= ff.hidden_field :id %> <%= ff.hidden_field :food_id, {class: "autocomplete-value"} %> - <%= label_tag :food_name, index > 0 ? '' : t(:field_ingredients) %> + <%= label_tag :food_name do %> + <%= index > 0 ? '' : t(:field_ingredients) %> * + <% end %> <%= text_field_tag :food_name, nil, {class: "autocomplete autocomplete-label", - style: "width: 80%;", - required: true} %> + style: "width: 80%;"} %> <%= ff.number_field :amount, {style: "width: 8%", step: :any, label: ''} %> <%= i.food.ref_unit.shortname if i.food %> <%= ff.hidden_field :_destroy %> @@ -69,6 +70,7 @@ new_row.find('label:first').hide(); form.find('tr.ingredient:visible a.icon-del').show(); autocompleteFood(new_row); + new_row.find('input:visible:first').focus(); } function deleteIngredient() { diff --git a/app/views/meals/create.js.erb b/app/views/meals/create.js.erb new file mode 100644 index 0000000..48cee13 --- /dev/null +++ b/app/views/meals/create.js.erb @@ -0,0 +1,2 @@ +$('#new-meal').empty(); +$('#meals').html('<%= j render partial: 'meals/index' %>'); diff --git a/app/views/meals/new.js.erb b/app/views/meals/new.js.erb index e24f70c..dd34200 100644 --- a/app/views/meals/new.js.erb +++ b/app/views/meals/new.js.erb @@ -1,2 +1,2 @@ -$('#new-meal') - .html('<%= j render partial: 'meals/new_form' %>'); +$('#new-meal').html('<%= j render partial: 'meals/new_form' %>'); +$('#food_name').focus();