【问题标题】:Rails 3 has_many :through form with dropdown menus?Rails 3 has_many:通过带有下拉菜单的表单?
【发布时间】:2012-01-21 22:10:00
【问题描述】:

我正在尝试通过加入 Rails 3(使用 Formtastic)来实现 has_many :但我有点卡住了。我的模型设置如下:

型号:

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][]

【问题讨论】:

  • railscasts.com 的嵌套模型表单集(编号 196 和 197)可能会提供一些想法。它们并非专门针对 has_many :through,但它们确实提供了为父对象拥有多个子字段的能力。
  • 我昨晚刚看了那些!我得到了这个功能,但我仍然坚持has_many :through 部分。

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


【解决方案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>

关键是手动添加&lt;input id="project_teams_none" name="team[employee_ids][]" type="hidden" value="" /&gt; 行,因为无论出于何种原因,它都没有作为表单的一部分生成。这让表单真正开始更新内容,然后我只需要让嵌套表单引用连接模型 (team) 而不是 employees,以便更新到正确的位置。

现在看起来很简单!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 2015-07-14
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2018-06-19
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多