我正在尝试构建一个用于存储食谱的应用程序,以便(最终)可以根据食谱成分构建购物清单。
我正在苦苦挣扎的是能够根据配料的measures
将配料链接到食谱,即,一个食谱可能使用 300克的面粉和一小撮盐,而另一种配方可能使用两杯面粉和一茶匙盐。
我用三个表设置了数据库:Recipes
,Measures
和Ingredients
。但是,我在尝试创建基本表单元素时遇到了麻烦,因此我可以将unit
(例如,克,杯或毫升)与量度(1或500)相关联。那么,如何将表格放在一起以允许这样做呢?
我通过为所有可用成分添加一个复选框集合来开始表单,但这仅允许将成分链接或不链接-我知道没有办法允许在此处添加其他输入。
这是recipes_controller:
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 %>
感谢您的帮助!