我是rails或编码的新手,试图通过创建一个简单的应用程序来学习,我不确定问这个问题是否愚蠢,但我试图真正找到问题的具体答案,但几天来每次都失败了,如果有人能帮我,我将不胜感激;
我有一个"平面"模型,它具有"PlaneModel"、"Xroutes"one_answers"Staff"属性。每个3个属性都是预先创建的,都有自己的表,在创建平面的新实例时,您只需通过"collection_select"从可用项目中进行选择。Plane.rb代码;
class Plane < ApplicationRecord
belongs_to :plane_model
belongs_to :xroute
has_many :staffs
accepts_nested_attributes_for :staffs
end
现在,由于数据库关系,Planes表有Planemodel_id、Xroute_id,但没有Staff_id。这就是问题所在,因为当我试图创建一个平面的实例时,"collection_select"很容易适用于前两个属性,分别指定Planemodel_id和Xroute_id。对于staff,尽管我想实现的是,在创建每个平面后,将plane_id分配到staff表中相应的staff行。员工代码.rb;
class Staff < ApplicationRecord
belongs_to :hub, optional: true
belongs_to :plane, optional: true
end
下面是平面的_form;
<%= 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 %>
飞机内部控制器new&创建白名单属性的函数和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
以下是正在发生的事情的视觉表现;
从下拉列表中选择用于创建新平面实例的窗体、PlaneModel、外部路线和3名工作人员。
提交后,将成功创建一个新实例。
这是平面的索引页,因为您可以看到PlaneModel和Xroute在那里。
然而,当我进入人员页面时,它并没有将创建的飞机的id放在选定的人员"plane_id"字段中,而是抛出了额外的3个人员实例,而没有更多信息。
人员索引页面显示新创建的空人员实例。
就像我说的,也许这是一件简单的事情,但我肯定错过了一些东西,感谢所有的帮助和帮助;建议。
谢谢,
accepts_nested_attributes_for :staffs
允许您在同一表单中创建一个staff实例和一个平面。但正如我所看到的,您只想选择现有的staff,对吗?您需要更改您的表单:
<div class="control-group">
<%= form.label :staff_ids %>
<div class="controls">
<%= form.collection_select( :staff_ids, Staff.all, :id, :name, {}, { multiple: true } ) %>
</div>
</div>
params:
def plane_params
params.require(:plane).permit(:plane_model_id, :xroute_id, staff_ids: [])
end
并从新动作中删除CCD_ 2