Создать метод с таблицей соединений - имеет и принадлежит многим - PullRequest
0 голосов
/ 11 октября 2018

Хорошо, у меня проблема.Я пытаюсь добавить некоторые ингредиенты в свою базу данных, но не могу понять, как я могу это сделать.

В моем контроллере у меня есть метод create

def create
  @drink = Drink.new(drink_params)
  @ingredient = Ingredient.find(params[:id])
  if @drink.save
    @drink.ingredients << @ingredient
    redirect_to drinks_path
  else
    render 'new'
  end
end

И тогда у меня возникает ошибка: не удается найти ингредиент без идентификатора.

И когда я меняю @ingredient= Ingredient.find (params [: id]) to @ingredient = Ingredient.all все работает нормально.Но я не хочу добавлять все мои ингредиенты, только некоторые из них.

Может кто-нибудь помочь мне с этим и объяснить это шаг за шагом?Буду благодарен.

1 Ответ

0 голосов
/ 11 октября 2018

Чтобы сохранить ингредиенты вместе с напитками, вам необходимо добавить accepts_nested_attributes_for к вашей Drink модели:

# app/models/drink.rb

class Drink < ActiveRecord::Base
  accepts_nested_attributes_for :ingredients
  ...
end

Затем добавьте ingredients_attributes в качестве разрешенных атрибутов параметров в методе drink_paramsвашего контроллера.Набор полей для ингредиентов зависит от вашей реализации.Например, если вы хотите иметь пользовательский интерфейс, в котором пользователь может вводить имя ингредиента и новую запись для этого ингредиента, который будет создан, только если в БД такого ингредиента еще нет, вам нужно заглянуть в таблицу ingrediends идобавьте id к ingredients_attributes:

# app/controllers/drinks_controller.rb

class DrinksController < ApplicationController
  def create
    @drink = Drink.new(drink_params)
    if @drink.save
      redirect_to drinks_path
    else
      render 'new'
    end
  end

  private

  def drink_params
    params.require(:drink).permit(:name, ingredients_attributes: [:name]).tap do |p|
      p[:ingredients_attributes].each do |i|
        ingredient = Ingredient.find_by(name: i[:name])
        i[:id] = ingredient.id if ingredient
      end
    end
  end
end
...