Rails 3 has_many: через форму с выпадающими меню? - PullRequest
2 голосов
/ 22 января 2012

Я пытаюсь реализовать 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: вложенные модельные формы работают и находятся на полпути.Это то, что я имею в виду:

<%= 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 Ответ

1 голос
/ 26 января 2012

Боже мой, я наконец-то заставил эту штуку работать. Вот соответствующий код, за исключением добавленных битов, чтобы заставить форму динамически добавлять и удалять поля:

_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, чтобы обновления шли в нужное место.

Выглядит теперь так просто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...