如何在 Rails 4.2 中为多对多关联创建表单
Posted
技术标签:
【中文标题】如何在 Rails 4.2 中为多对多关联创建表单【英文标题】:How to create form for many to many association in Rails 4.2 【发布时间】:2015-06-17 14:59:23 【问题描述】:我正在尝试创建食谱应用。在我的应用程序中,我有表成分(名称),表食谱(类型_of,代码,描述)连接表数量(recipe_id,成分_id,数量)
我希望能够在创建时将配料添加到我的食谱中。食谱可以有很多成分。
我的模型:
class Ingredient < ActiveRecord::Base
has_many :quantities
has_many :recipes, through: :quantities
has_many :stock_of_ingredients
end
class Quantity < ActiveRecord::Base
belongs_to :recipe
belongs_to :ingredient
accepts_nested_attributes_for :ingredient,
:reject_if => :all_blank
end
class Recipe < ActiveRecord::Base
has_many :quantities
has_many :ingredients, :through => :quantities
accepts_nested_attributes_for :quantities,
:reject_if => :all_blank,
:allow_destroy => true
accepts_nested_attributes_for :ingredients
end
我的 Recipe 控制器是从脚手架创建的
def create
@recipe = Recipe.new(recipe_params)
respond_to do |format|
if @recipe.save
format.html redirect_to @recipe, notice: 'Recipe was successfully created.'
format.json render :show, status: :created, location: @recipe
else
format.html render :new
format.json render json: @recipe.errors, status: :unprocessable_entity
end
end end
我也加了
def recipe_params
params.require(:recipe).permit(:type_of_base, :code, :description, :quantities_attributes =>[:quantity, :recipe_id, :ingredient_id, :ingredient_attributes])
end
我不知道我需要从基本控制器创建的数量控制器吗?
现在我的表单是这样的
<%= form_for(@recipe, html: class: "form-horizontal", role: "form" ) do |f| %>
...
<div class="form-group">
...
</div>
<div class="ingderdient-wraper">
<%= render "quantites/quantity_fields" %>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<%= f.submit class: "btn btn-primary" %>
</div>
</div>
<% end %>
还有我的渲染文件
<%= text_field :quantity %>
<%= select :ingredient_ids, Ingredient.all.collect |x| [x.name, x.id], , :multiple => true %>
但这也不能正常工作,我希望有可能添加更多的成分。需要一个按钮添加更多。
如果有人可以向我解释如何直截了当。问候
【问题讨论】:
不能正常工作是什么意思? 不将数据保存到数量表中。 请发布您的日志。 谢谢,现在我的参数数量错误(1 代表 2..3) 【参考方案1】:据我了解,您只需要制作一个 javascript 方法来动态生成字段,您可以按照这个 rails cast http://railscasts.com/episodes/197-nested-model-form-part-2。这正是您所需要的。
【讨论】:
【参考方案2】:在我看来,你的模型有问题。在此任务中,您应该使用 has_and_belongs_to_many (habtm) 关联。你可以看到Active Record Associations
你可以制作模型:
class Ingredient < ActiveRecord::Base
has_and_belongs_to_many :recipes
...
end
class Recipe < ActiveRecord::Base
has_and_belongs_to_many :ingredients
...
end
在迁移中:
def self.up
create_table :ingradients, force: true do |t|
t.string :name
t.references :recipe, index: true
t.timestamps null: false
end
create_table :recipes, force: true do |t|
t.string :name
t.references :ingradient, index: true
t.timestamps null: false
end
create_table :ingradients_recipes, force: true, id: false do |t|
t.belongs_to :ingradient, index: true
t.belongs_to :recipe, index: true
t.integer :quantity
end
end
我认为接下来的步骤会很简单......
【讨论】:
以上是关于如何在 Rails 4.2 中为多对多关联创建表单的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中为多对多关系(和中间表)做一个选择字段?
Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号