1
votes

i'm building a web application with Rails 5.2.0 about recipes and I have a doubt about the create method of the controller.

This are my models:

class Recipe < ApplicationRecord
    belongs_to :user
    has_many :quantities
    has_many :ingredients, through: :quantities

    accepts_nested_attributes_for :quantities, allow_destroy: true
end

class Quantity < ApplicationRecord    
    belongs_to :recipe
    belongs_to :ingredient
end

class Ingredient < ApplicationRecord
    has_many :quantities
    has_many :recipes, through: :quantities
end

And here the view to create new recipes:

<%= form_for(@recipe) do |f| %>

    <%= f.label :name, "Name" %>
    <%= f.text_field :name %>

    <%= f.label :servings, "Servings" %>
    <%= f.number_field :servings %>


    <%= f.fields_for :quantities do |quantity| %>

        <%= f.hidden_field :_destroy, class: "hidden-field-to-destroy" %>

        <%= f.label :ingredient_id, "Ingredient Name" %>
        <%= f.text_field :ingredient_id%>

        <%= f.label :amount, "Amount" %>
        <%= f.number_field :amount %>

        <%= f.label :unit, "Unit" %>
        <%= f.select(:unit, ["kg","g","l","ml"], {include_blank: true}) %>
    <% end %>

    <%= f.submit 'Add new recipe' %>

<% end %>

I can add new ingredients dynamically with jquery and also delete them in the same form.

The update method of the controller works perfectly but the create method does not work:

class RecipesController < ApplicationController
    def create
        @recipe = current_user.recipes.build(recipe_params)
        if @recipe.save
            flash[:success] = "New recipe created correctly."
            redirect_to @recipe
        else
          render 'new'
        end
    end 

    def update
        @recipe = Recipe.find(params[:id])
        if @recipe.update_attributes(recipe_params)
          flash[:success] = "The recipe has been updated correctly."
          redirect_to @recipe
        else
          render 'edit'
        end
    end

    private
        def recipe_params
            params.require(:recipe).permit( :name, :servings, quantities_attributes: [:ingredient_id, :amount, :unit,:_destroy, :id, :recipe_id])
        end
end

I'm trying to do @recipe = current_user.recipes.build(recipe_params) but I get the following error in te view:

  • Quantities recipe can't be blank

I think this occurs because when trying to create the relation, it is necessary to indicate the recipe_id, but the recipe has not yet been created and the id can not be indicated.

Could you please tell me someone what would be the correct way to create the recipe first and then be able to add the ingredients through Quantity in the create method of the recipe controller?

1

1 Answers

0
votes

As per the message shared the qunatity_recipes cannot be blank and you haven't specified any condition to manage this.

Current

class Recipe < ApplicationRecord
 belongs_to :user
 has_many :quantities
 has_many :ingredients, through: :quantities

 accepts_nested_attributes_for :quantities, allow_destroy: true
end

Update the accepts nested attributes to allow_nil for Recipe class

class Recipe < ApplicationRecord
 belongs_to :user
 has_many :quantities
 has_many :ingredients, through: :quantities

 accepts_nested_attributes_for :quantities, allow_destroy: true, allow_nil: true
end