Rails has_many,通过向联接表添加变量的形式

时间:2019-01-02 22:50:12

标签: forms ruby-on-rails-5 has-many-through

我正在尝试构建一个用于存储食谱的应用程序,以便(最终)可以根据食谱成分构建购物清单。

我正在苦苦挣扎的是能够根据配料的measures将配料链接到食谱,即,一个食谱可能使用 300克的面粉和一小撮盐,而另一种配方可能使用两杯面粉和一茶匙盐。

我用三个表设置了数据库:RecipesMeasuresIngredients。但是,我在尝试创建基本表单元素时遇到了麻烦,因此我可以将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 %>

感谢您的帮助!

0 个答案:

没有答案