Rails has_many, через форму добавление переменных в таблицу соединений - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать приложение для хранения рецептов, чтобы можно было (в конечном итоге) создавать списки покупок на основе ингредиентов рецептов.

То, с чем я борюсь, это возможность связать ингредиенты с рецептами на основе их measures, то есть рецепт может использовать 300 грамм муки и одну щепотку соли в то время как другой рецепт может использовать две чашки муки и одну чайную ложку соли.

Я настроил БД с тремя таблицами: Recipes, Measures и Ingredients. Однако я застреваю, пытаясь создать базовые элементы формы, чтобы связать unit (например, грамм, чашки или мл) с количеством (1 или 500) меры. Итак, как мне составить форму, чтобы позволить это?

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

Вот рецепт_контроллера:

def new
  @recipe = Recipe.new

  @ingredients = Ingredient.all
end

def edit
  @recipe = Recipe.find(params[:id])
  @ingredients = Ingredient.all
end

def create
  @recipe = Recipe.new(recipe_params)

  if @recipe.save
    redirect_to @recipe
  else
    render 'new'
  end
end
...
private
  def recipe_params
    params.require(:recipe).permit(:name, :method, :category, ingredient_ids:[])
  end

И модели:

class Recipe < ApplicationRecord
  has_many :measures
  has_many :ingredients, through: :measures
  accepts_nested_attributes_for :ingredients
end

class Measure < ApplicationRecord
  belongs_to :ingredient
  belongs_to :recipe
  accepts_nested_attributes_for :ingredient
end

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

И основная форма рецепта частичная:

# /views/recipes/_form.html.erb
<%= form_for(@recipe) do |form| %>

  <% if @recipe.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@recipe.errors.count, "error") %> prohibited
        this recipe from being saved:
      </h2>
      <ul>
        <% @recipe.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= form.label :name %><br>
    <%= form.text_field :name %>
  </p>

  <p>
    <%= form.collection_check_boxes :ingredient_ids, @ingredients, :id, :name %>
  </p>

  <p>
    <%= form.fields_for :measures do |ff| %>
      <% @ingredients.each do |ingredient| %>
        <%= ff.label :unit %>
        <%= ff.text_field :unit %> | 
        <%= ff.label :quantity %>
        <%= ff.text_field :quantity %> | 
        <%= ff.label ingredient.name %>
        <%= ff.check_box :ingredient_id %>     
        <br>
      <% end %>
    <% end %>
  </p>

  <p>
    <%= form.submit %>
  </p>

<% end %>

Спасибо за вашу помощь!

...