13

開発者とタスクの 2 つのモデルがあります。

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

割り当てテーブルを追加して関係を管理しているので、特に 1 つのタスクに多くの開発者を追加できます。また、「estimated_time」など、結合テーブルに追加した他のフィールドも操作できるようにしたいと考えています。 achievement_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

考えられるアプローチは 2 つあります。

両方について、モデルに以下を追加する必要があります。

class Task
  accepts_nested_attributes_for :assignments
end

を使用している場合は、それattr_accesibleに追加する必要があることに注意してくださいassignments_attributes

簡単なアプローチ

最大で a に割り当てられる割り当ての数がわかっているとしますtask。簡単にするために 1 と仮定します。

コントローラーで、次のように記述します。

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

これにより、新しい割り当てが 1 つあることが確認されます。

あなたの見解では、次のように書いてください。

= 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'

そして、パーシャルを定義します_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 の回答と非常に似ていますが、この関連付けにはチェック ボックスを使用しないでください。1 人の開発者を含む 1 つの割り当てを扱うことになるからです。また、ネストされた属性を使用すると、必要な数の割り当てを作成できるはずです。

それが、始めるのに最も簡単な方法だと私は信じています。

于 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 に答える