Создайте метод контроллера с accepts_nested_attributes_for и fields_for - PullRequest
0 голосов
/ 25 мая 2018

Я создаю веб-приложение с Rails 5.2.0 о рецептах, и у меня есть сомнения по поводу метода create контроллера.

Это мои модели:

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

А вот и вид для создания новых рецептов:

<%= 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 %>

Я могу динамически добавлять новые ингредиенты с помощью jquery, а также удалять их в той же форме.

Метод контроллера update работает отлично, но метод create не работает:

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

Я пытаюсь сделать @recipe = current_user.recipes.build(recipe_params), но я получаю следующую ошибкув представлении:

  • рецепт количества не может быть пустым

Я думаю, что это происходит, потому что при попытке создать отношение необходимочтобы указать recipe_id, но рецепт еще не создан, и идентификатор не может быть указан.

Не могли бы вы сказать мне, кто будет правильным способом для создания рецепта, а затем можно будет добавитьингредиенты через Количество в методе создания контроллера рецептов?

1 Ответ

0 голосов
/ 25 мая 2018

Согласно общему сообщению qunatity_recipes не может быть пустым, и вы не указали никаких условий для управления этим.

Текущий

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

 accepts_nested_attributes_for :quantities, allow_destroy: true
end

Обновление принимает вложенные атрибуты для allow_nil для Recipeкласс

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
...