HABTM Форма не работает в рельсах.Не отправлять в таблицы присоединения - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь назначить команду игроку. У игрока может быть много команд, но при начальной настройке у него есть только одна команда. Я пытаюсь настроить выбор, чтобы пользователь мог выбрать команду.

Когда я отправляю форму данные для других полей, first_name и last_name отправляют штраф, однако никакие данные не сохраняются в соединительной таблице. Я использую флажок выбора, однако флажки тоже будут работать, если кто-то может подумать об этом.

Модель

У меня 2 модели. Игроки и команды настроены на отношения HABTM.

class Player < ActiveRecord::Base
has_and_belongs_to_many :teams

class Team< ActiveRecord::Base
has_and_belongs_to_many :players

Контроллер

  def new
@player = Player.new
end

def create
@player = Player.new(params[:player])
if @player.save
  flash[:notice] = "Player Created"
  redirect_to(:action =>'list')
else
  render('new')
end
end

Присоединиться к столу

Я могу вставить данные в таблицу соединений из консоли rails. Затем я могу получить эти данные и показать их. Так что отношения работают.

create_table "players_teams", :id => false, :force => true do |t|
t.integer "player_id"
t.integer "team_id"
end

add_index "players_teams", ["player_id", "team_id"], :name =>  "index_players_teams_on_player_id_and_team_id"

View

На мой взгляд, у меня есть

<%= f.collection_select(:team_id, Team.all, :id, :name, :prompt => true) %>

Это загружает представление с заполненными командами. После отправки я получаю

Parameters: {"utf8"=>"✓", "authenticity_token"=>"kvOmx3G5H1mqLMnEn6HS3a79+WQnIzfsUA3Dt0XHo1w=", "player"=>{"first_name"=>"Test", "last_name"=>"Data", "email"=>"email@email.com"}, "teams"=>{"team_id"=>"1"}, "commit"=>"create player"}

Я не уверен, куда идти отсюда.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Куда в форме вы кладете коллекцию? Может быть, это опечатка, но это должно быть

<%= form_for(@player) do |f| %>
  ...
  <%= f.collection_select(:team_ids, Team.all, :id, :name, :prompt => true) %>
  ...
<% end %>

и вы должны получить

Parameters: {
  "utf8"=>"✓", "authenticity_token"=>"kvOmx3G5H1mqLMnEn6HS3a79+WQnIzfsUA3Dt0XHo1w=",   
  "player"=>{
    "first_name"=>"Test",
    "last_name"=>"Data",
    "email"=>"email@email.com",
    "team_ids"=>["1"]
   }, 
   "commit"=>"create player"
 }

, что означает, что атрибут team_ids устанавливается формой.

0 голосов
/ 06 марта 2012

Ваш параметр неверен. Поскольку игрок has_and_belongs_to_many :teams, правильный параметр - team_ids. Однако это должен быть массив, поэтому вам нужно что-то вроде этого:

<%= f.collection_select("team_ids[]", Team.all, :id, :name, :prompt => true) %>

Я верю, что должен это сделать.

...