Rails 3 has_many:通过带有下拉菜单的表单?

时间:2012-01-21 22:10:00

标签: ruby-on-rails has-many-through formtastic

我正在尝试实现一个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][]

1 个答案:

答案 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,以便更新到达正确的位置

现在看起来很简单!

相关问题