Rails 5 - form_with - fields_for 在创建父项时分配嵌套属性。
Rails 5 - form_with - fields_for assign nested attributes upon creation of parent items.
我是 rails 或一般编码的新手,试图通过创建一个简单的应用程序来学习,我不确定这样问是否愚蠢,但我确实尝试找到一个具体的答案问题,几天来每次都失败,如果有人能帮助我,我将不胜感激;
我有一个 "Plane" 模型,它具有 "PlaneModel"、"Xroutes" 和 "Staffs" 属性。每 3 个属性都是预先创建的,有自己的 tables,并且在创建平面的新实例时,您只需 select 通过 "collection_select" 通过可用项目。 Plane.rb;
代码
class Plane < ApplicationRecord
belongs_to :plane_model
belongs_to :xroute
has_many :staffs
accepts_nested_attributes_for :staffs
end
现在,由于数据库关系,飞机 table 有 Planemodel_id、Xroute_id 但 没有 Staff_id。问题就在这里,因为当我尝试创建一个平面实例时,"collection_select" 很容易用于前 2 个属性,分别分配 Planemodel_id 和 Xroute_id。对于员工,虽然我想要实现的是,在创建每个平面之后,将 plane_id 分配给员工 table 中相应的员工行。 Staff.rb;
代码
class Staff < ApplicationRecord
belongs_to :hub, optional: true
belongs_to :plane, optional: true
end
下面是飞机的_表格;
<%= form_with(model: plane, local: true) do |form| %>
<div class="control-group">
<%= form.label :plane_model_id %>
<div class="controls">
<%= collection_select( :plane, :plane_model_id, PlaneModel.all, :id, :name, {}, { :multiple => false } ) %>
</div>
</div>
<div class="control-group">
<%= form.label :xroute_id %>
<div class="controls">
<%= collection_select( :plane, :xroute_id, Xroute.all, :id, :name, {}, { :multiple => false } ) %>
</div>
</div>
<%= form.fields_for :staffs do |staff| %>
<div class="control-group">
<%= staff.label :staff_id %>
<div class="controls">
<%= staff.collection_select( :plane_id, Staff.all, :id, :name, { :multiple => false } ) %>
</div>
</div>
<% end %>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
在plane controller new & create函数和params函数中将属性列入白名单;
def new
@plane = Plane.new
3.times { @plane.staffs.build }
end
def create
@plane = Plane.new(plane_params)
respond_to do |format|
if @plane.save
format.html { redirect_to @plane, notice: 'Plane was successfully created.' }
format.json { render :show, status: :created, location: @plane }
else
format.html { render :new }
format.json { render json: @plane.errors, status: :unprocessable_entity }
end
end
end
def plane_params
params.require(:plane).permit(:plane_model_id, :xroute_id, staffs_attributes: [:id, :staff, :plane_id])
end
这是正在发生的事情的直观表示;
Form for creating new plane instance, PlaneModel, Xroute and 3 staff members are selected from dropdown lists.
When submitted, a new instance is successfully created.
Here is the index page for Planes, as you see PlaneModel and Xroute are there.
不过,当我转到员工页面时,它没有将创建的飞机的 ID 放入 selected 员工 "plane_id" 字段中,而是抛出额外的 3 个员工实例,而没有任何更多信息。
Staff index page showing, newly created empty staff instances.
就像我说的,也许这是一件简单的事情,但我肯定遗漏了一些东西,感谢所有的帮助和建议。
谢谢,
accepts_nested_attributes_for :staffs
允许您在同一个表单内创建一个员工实例和一个平面。但据我所知,您只需要 select 现有员工,对吗?你需要改变你的形式:
<div class="control-group">
<%= form.label :staff_ids %>
<div class="controls">
<%= form.collection_select( :staff_ids, Staff.all, :id, :name, {}, { multiple: true } ) %>
</div>
</div>
参数:
def plane_params
params.require(:plane).permit(:plane_model_id, :xroute_id, staff_ids: [])
end
并从新操作中删除 3.times { @plane.staffs.build }
我是 rails 或一般编码的新手,试图通过创建一个简单的应用程序来学习,我不确定这样问是否愚蠢,但我确实尝试找到一个具体的答案问题,几天来每次都失败,如果有人能帮助我,我将不胜感激;
我有一个 "Plane" 模型,它具有 "PlaneModel"、"Xroutes" 和 "Staffs" 属性。每 3 个属性都是预先创建的,有自己的 tables,并且在创建平面的新实例时,您只需 select 通过 "collection_select" 通过可用项目。 Plane.rb;
代码class Plane < ApplicationRecord
belongs_to :plane_model
belongs_to :xroute
has_many :staffs
accepts_nested_attributes_for :staffs
end
现在,由于数据库关系,飞机 table 有 Planemodel_id、Xroute_id 但 没有 Staff_id。问题就在这里,因为当我尝试创建一个平面实例时,"collection_select" 很容易用于前 2 个属性,分别分配 Planemodel_id 和 Xroute_id。对于员工,虽然我想要实现的是,在创建每个平面之后,将 plane_id 分配给员工 table 中相应的员工行。 Staff.rb;
代码class Staff < ApplicationRecord
belongs_to :hub, optional: true
belongs_to :plane, optional: true
end
下面是飞机的_表格;
<%= form_with(model: plane, local: true) do |form| %>
<div class="control-group">
<%= form.label :plane_model_id %>
<div class="controls">
<%= collection_select( :plane, :plane_model_id, PlaneModel.all, :id, :name, {}, { :multiple => false } ) %>
</div>
</div>
<div class="control-group">
<%= form.label :xroute_id %>
<div class="controls">
<%= collection_select( :plane, :xroute_id, Xroute.all, :id, :name, {}, { :multiple => false } ) %>
</div>
</div>
<%= form.fields_for :staffs do |staff| %>
<div class="control-group">
<%= staff.label :staff_id %>
<div class="controls">
<%= staff.collection_select( :plane_id, Staff.all, :id, :name, { :multiple => false } ) %>
</div>
</div>
<% end %>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
在plane controller new & create函数和params函数中将属性列入白名单;
def new
@plane = Plane.new
3.times { @plane.staffs.build }
end
def create
@plane = Plane.new(plane_params)
respond_to do |format|
if @plane.save
format.html { redirect_to @plane, notice: 'Plane was successfully created.' }
format.json { render :show, status: :created, location: @plane }
else
format.html { render :new }
format.json { render json: @plane.errors, status: :unprocessable_entity }
end
end
end
def plane_params
params.require(:plane).permit(:plane_model_id, :xroute_id, staffs_attributes: [:id, :staff, :plane_id])
end
这是正在发生的事情的直观表示;
Form for creating new plane instance, PlaneModel, Xroute and 3 staff members are selected from dropdown lists.
When submitted, a new instance is successfully created.
Here is the index page for Planes, as you see PlaneModel and Xroute are there.
不过,当我转到员工页面时,它没有将创建的飞机的 ID 放入 selected 员工 "plane_id" 字段中,而是抛出额外的 3 个员工实例,而没有任何更多信息。
Staff index page showing, newly created empty staff instances.
就像我说的,也许这是一件简单的事情,但我肯定遗漏了一些东西,感谢所有的帮助和建议。
谢谢,
accepts_nested_attributes_for :staffs
允许您在同一个表单内创建一个员工实例和一个平面。但据我所知,您只需要 select 现有员工,对吗?你需要改变你的形式:
<div class="control-group">
<%= form.label :staff_ids %>
<div class="controls">
<%= form.collection_select( :staff_ids, Staff.all, :id, :name, {}, { multiple: true } ) %>
</div>
</div>
参数:
def plane_params
params.require(:plane).permit(:plane_model_id, :xroute_id, staff_ids: [])
end
并从新操作中删除 3.times { @plane.staffs.build }