我正在尝试实现一个has_many:通过加入Rails 3(使用Formtastic),我有点卡住了。我的模型设置如下:
型号:
class Project < ActiveRecord::Base
has_many :employees, :through => :teams
has_many :teams
class Employee < ActiveRecord::Base
has_many :projects, :through => :teams
has_many :teams
class Team < ActiveRecord::Base
belongs_to :project
belongs_to :employee
这一行在项目视图中为我提供了一个允许员工选择的多选框:
查看:
<%= f.input :employees, :as => :select %>
到目前为止,这已经完成了工作,但我想要的是一个单独的下拉框,用于选择每个员工的姓名,然后选择他们在项目中的角色。我找不到表格代码让我到那里......
修改
正如所建议的那样,我已经从Railscast 197: Nested Model Forms获得了代码,并且它已经在那里工作了。这就是我在视图中所拥有的:
<%= f.semantic_fields_for :employees do |builder| %>
<%= render 'employee_fields', :f => builder %>
<% end %>
<%= link_to_add_fields "add employee", f, :employees %>
和'employee_fields'部分:
<p class="fields">
<%= f.input :name, :as => :select, :collection => Employee.find(:all) %>
<%= f.hidden_field :_destroy %>
<%= link_to_remove_fields "remove", f %>
</p>
但是现在这会创建一个新员工而不是一个新团队(项目员工加入记录),所以我认为它是has_many
而不是has_many :through
。如何对其进行编辑,以便上面的:name
输入将记录添加到project[employee_ids][]
?
答案 0 :(得分:1)
天哪,我终于把这件事搞定了。这是相关代码,减去为了使表单动态添加和删除字段而添加的位:
<强> _form.html.erb 强>
<%= semantic_form_for @project do |f| %>
.
.
<%= f.semantic_fields_for :teams do |builder| %>
<input id="project_teams_none" name="team[employee_ids][]" type="hidden" value="" />
<%= render 'team_fields', :f => builder %>
<% end %>
<强> _team_fields.html.erb 强>
<div class="input">
<%= f.collection_select(:employee_id, Employee.all, :id, :name, :include_blank => true ) %>
</div>
关键是手动添加<input id="project_teams_none" name="team[employee_ids][]" type="hidden" value="" />
行,因为无论出于何种原因,这不是作为表单的一部分生成的。这得到了实际开始更新的形式,然后我只需要使嵌套表单引用连接模型(team
)而不是employees
,以便更新到达正确的位置
现在看起来很简单!