Я пытаюсь создать приложение для хранения рецептов, чтобы можно было (в конечном итоге) создавать списки покупок на основе ингредиентов рецептов.
То, с чем я борюсь, это возможность связать ингредиенты с рецептами на основе их 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 %>
Спасибо за вашу помощь!