13

我有两个模型,开发人员和任务,

class Developer < ActiveRecord::Base
  attr_accessible :address, :comment, :email, :name, :nit, :phone, :web
  has_many :assignments
  has_many :tasks, :through => :assignments
end

class Task < ActiveRecord::Base
  attr_accessible :description, :name, :sprint_id, :developer_ids
  has_many :assignments
  has_many :developers, :through => :assignments
end

class Assignment < ActiveRecord::Base
  attr_accessible :accomplished_time, :developer_id, :estimated_time, :status, :task_id
  belongs_to :task
  belongs_to :developer
end

我通过添加分配表来处理关系,因此我可以将许多开发人员特别添加到一项任务中,现在我还希望能够操作我添加到连接表中的其他字段,例如“estimated_time”,“完成时间'......等等......我在Simple_form上得到的是`

<%= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| %>
  <%= f.input :name %>
  <%= f.input :description %>
  <%= f.association :developers, :as => :check_boxes %>

  <div class="form-actions">
    <%= f.button :submit, :class => 'btn-primary' %>
    <%= link_to t('.cancel', :default => t("helpers.links.cancel")),
                project_sprint_path(@sprint.project_id,@sprint), :class => 'btn' %>
  </div>
<% end %>`

这仅允许我选择开发人员,我希望能够在那里修改estimated_time 字段。

有什么建议么?

4

3 回答 3

29

我喜欢 simple-form 有关联助手的方式,在某些情况下让它变得非常容易。不幸的是,你想要的只是简单的形式无法解决。

您必须为此创建assignments工作。

有两种可能的方法。

对于两者,您都必须将以下内容添加到您的模型中:

class Task
  accepts_nested_attributes_for :assignments
end

请注意,如果您正在使用attr_accesible,您还应该添加assignments_attributes到它。

简单的方法

假设您知道 a 最多有多少个任务task。为简单起见,假设为 1。

在你的控制器中,写

def new
  @task = Task.build
  @task.assignments.build
end

这将确保有一项新任务。

在你看来写:

= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| 
  = f.input :name 
  = f.input :description 

  = f.simple_fields_for :assignments do |assignment|
    = assignment.association :developer, :as => :select
    = assignment.estimated_time

  .form-actions
    = f.button :submit, :class => 'btn-primary'
    = link_to t('.cancel', :default => t("helpers.links.cancel")),
                project_sprint_path(@sprint.project_id,@sprint), :class => 'btn'

这种方法的问题是:如果您想要超过 1、2 或 3 个怎么办?

使用茧

Cocoon是一个允许您创建动态嵌套表单的 gem。

你的观点会变成:

= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| 
  = f.input :name 
  = f.input :description 

  = f.simple_fields_for :assignments do |assignment|
    = render `assignment_fields`, :f => assignment
  .links
    = link_to_add_association 'add assignment', f, :assignments

  .form-actions
    = f.button :submit, :class => 'btn-primary'
    = link_to t('.cancel', :default => t("helpers.links.cancel")),
                project_sprint_path(@sprint.project_id,@sprint), :class => 'btn'

并定义一个 partial _assignment_fields.html.haml

.nested_fields
  = f.association :developer, :as => :select
  = f.estimated_time
  = link_to_remove_association 'remove assignment', f

希望这可以帮助。

于 2012-10-15T21:58:18.067 回答
4

问题是通过使用这个:

<%= f.association :developers, :as => :check_boxes %>

您实际上只是设置了 developer_ids 属性,它会自动为您构建分配,因为它有很多 :through。为此,我相信您可能应该为每个作业使用嵌套属性,并且每条记录都会有一个选择框或类似的东西来为该任务中的特定作业选择相关开发人员。这与 Cojones 的回答非常相似,但您不应该为此关联使用复选框,因为您将处理包含单个开发人员的单个任务。使用嵌套属性,您应该能够创建任意数量的分配。

我相信这是最简单的开始方式。

于 2012-10-15T01:44:56.543 回答
3

我认为它应该看起来像这样:

= f.simple_fields_for :assignments do |fa|
  = fa.association :developer, as: :check_boxes
  = fa.input :estimated_time
  ...
于 2012-10-13T09:44:29.177 回答