Создание метода добавления новой записи в таблицу в Rails 3.1 - PullRequest
0 голосов
/ 02 февраля 2012

Я новичок в Rails.У меня есть три стола игроков, составы и составы.У меня есть записи модели, чтобы создать отношения, в которых игроки принадлежат к спискам и составам игроков, составу игроков has_many и составам игроков has_many.

Проблема, с которой я столкнулся, заключается в том, что при создании реестра у меня есть атрибут roster_name, и я могу добавить к нему одного игрока.Я хочу добавить больше игроков в тот же список, но я борюсь с тем, как добавить нового игрока в список.Новое представление по умолчанию вызывает частичную форму _form, которая требует от меня создания совершенно нового списка, что позволит мне снова добавить одного пользователя.

Каким образом можно добавить нового игрока в существующий состав.Пожалуйста, помогите мне понять, какие компоненты мне нужны.Нужен ли мне новый партиал, который я могу вызвать, чтобы иметь поле для добавления нового игрока?Должен ли я создать новый метод или контроллер?Я предполагаю, что мне нужен способ ссылаться на существующий список, чтобы иметь возможность добавить новый player_id.Любая помощь будет отличной.

Вот мои модели / контроллеры и вид

My model roster.rb
class Roster < ActiveRecord::Base
    has_many :players

    accepts_nested_attributes_for  :players, :allow_destroy => true
end
My model player.rb
class Player < ActiveRecord::Base
    belongs_to :roster
end
My controller rosters_controller.rb
def new
    @roster = Roster.new
    @players = Player.all
End

My roster view
<%= form_for(@roster) do |f| %>                                   
  <% if @roster.errors.any? %>                                    
    <div id="error_explanation">                                  
      <h2><%= pluralize(@roster.errors.count, "error") %> prohibited this roster from being saved:</h2>

      <ul>
      <% @roster.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>                           
      <% end %>                                       
      </ul>                                           
    </div>                                            
  <% end %>                                           

  <div class="field">
    <%= f.label :player_id %><br />
    <%= f.text_field :player_id %>
  <%= collection_select("roster", "player_id", @players, "id", "gname") %>
  </div>
  <div class="field">
    <%= f.label :player_id %><br />
    <%= f.text_field :player_id %>
  <%= collection_select("roster", "player_id", @players, "id", "gname") %>

  </div>

  <div class="actions">
    <%= f.submit %>
  </div>

1 Ответ

0 голосов
/ 02 февраля 2012

Поскольку это ассоциация «многие ко многим», ассоциация has_many :through часто используется для установки связи «многие ко многим» с другой моделью. Эта связь указывает на то, что декларирующая модель может быть сопоставлена ​​с нулем или более экземплярами другой модели путем прохождения третьей модели. Теперь декларации ассоциации могут выглядеть так:

class Roster < ActiveRecord::Base
  has_many :roster_players
  has_many :players, :through => :roster_players
end

class RosterPlayer < ActiveRecord::Base
  belongs_to :roster
  belongs_to :player
end

class Player < ActiveRecord::Base
  has_many :roster_players
  has_many :roster, :through => :roster_players
end

Шаг 1: Создать модель ассоциации.

$> rails g model roster_player roster:references player:references
$> rake db:migrate

Шаг 2: То, что вам требуется, это способ приема вложенных атрибутов. Пройдите по этому рельсовому касту и прочитайте о nested_attributes . Кодовая форма, которую бросают рельсы, была извлечена Райаном Бейтсом как драгоценный камень и очень полезна.

Обновите ваш гемфайл, чтобы он требовал этот камень

gem 'nested_form'
$> bundle install

Затем запустите генератор, чтобы создать файл JavaScript. Это автоматически определит, используете ли вы jQuery или Prototype.

rails g nested_form:install

Запуск генератора добавит файл nested_form.js, который должен быть включен после инфраструктуры jQuery или Prototype.

<%= javascript_include_tag :defaults, "nested_form" %>

Давайте извлечем вложенные атрибуты в часть с именем _roster_player_fields.html.erb

<div class="field">
  <%= f.label :player_id, "Player" %>
  <%= f.select :player_id, Player.all.collect { |p| [ p.name, p.id ] }, { :include_blank => true } %>
</div>

То, что мы хотим сделать здесь, это добавить в форму поля для каждого списка игроков. Мы можем использовать метод fields_for для управления связанными полями в форме, передавая ему имя связанной модели, а затем перебирая все связанные записи проигрывателя и создавая построитель форм для каждого из них. Строитель отрендерит партиал для каждого игрока.

<%= form_for(@roster) do |f| %>                                   
  <% if @roster.errors.any? %>                                    
    <div id="error_explanation">                                  
      <h2><%= pluralize(@roster.errors.count, "error") %> prohibited this roster from being saved:</h2>

      <ul>
      <% @roster.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>                           
      <% end %>                                       
      </ul>                                           
    </div>                                            
  <% end %>                                           

  <% f.fields_for :roster_players do |builder| %>
    <%= render 'roster_player_fields', :f => builder %>
  <% end %>
  <%= link_to_add_fields "[+] Add Player", f, :roster_players %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Когда эта форма отображается, она будет выглядеть так, как раньше. Это связано с тем, что в новом списке не будет игроков, связанных с ним, и поэтому ни одно из полей игроков не будет отображаться. В конечном итоге мы хотим, чтобы в форме была ссылка «Добавить игрока», но мы можем просто создать roster_player в новом действии RosterController и отобразить его поля.

def new
  @roster = Roster.new
  @roster.roster_players.build
End

По умолчанию обновление вложенных атрибутов отключено, вы можете включить его, используя метод класса #accepts_nested_attributes_for. При включении вложенных атрибутов в модели определяется средство записи атрибутов. Это должно сработать и надеюсь, что это поможет.

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