2009-08-08 2 views
0

Надеюсь, мой вопрос понятен, иначе я буду рад прояснить.Tricky ruby ​​on rails problem. Существует ли простое решение?

У нас есть это спортивное мероприятие, и я с удовольствием регистрирую людей. :)

Факты:

  • один может иметь команду из 5-10 человек.
  • Необходимо знать порядок, в котором люди начинают.
  • Необходимо знать, кто лидер команды.

Я сделал форму в следующем стиле:

  1. o [____Write first name here___]< --- это текстовое поле
  2. o [____Write second name here__]
  3. o [___________ ... ____________]
  4. ...

«o» - это кнопка радиоприемника, используемая для выбора руководителя команды.

У меня есть модель Лицо и модель Команда. Каждая команда имеет leader_id (который является одним из идентификаторов личности). Кроме того, каждая команда :has_many человек.

В контроллере у меня есть

def create 
    @team = Team.new(params[:team]) 
    @team.save #just assume there are no errors 
end 

По мнению у меня есть (для кнопок радио):

<input id="team_leader_id_**????**" 
     name="team[leader_id]" 
     type="radio" 
     value="**????**" 
/> 

<input id="team_leader_id_**????**" 
     name="team[leader_id]" 
     type="radio" 
     value="**????**" 
/>  
# etc. 

Мой вопрос: Что я должен поставить в **????**?

Я еще не знаю идентификаторов лиц, так как они не были созданы. Мне нужно добавить там мета-идентификатор, который рубин на рельсах распознает и правильно связывает?

Вы не должны читать остальные (он описывает хак я использую)

Как уже говорилось, на данный момент я делаю безобразный хак: сначала сохранить команду (без генерации лидер), а затем извлечь ту же команду из БД, получить его людей, и найти первое лицо сопрягая значение

params[:team][:leader_id]. 

Наконец сохранение ID этого человека в поле leader_id команды.

Но этот код неэффективен, огромен и глючен, что я подозреваю, что есть более простой способ.

ответ

2

Радиооборудование должно иметь то же имя, т.е.

<input id="team_persons_attributes_0_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="0" 
/> 
<input id="team_persons_attributes_1_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="1" 
/> 
<input id="team_persons_attributes_2_leader_id" 
     name="team[persons_attributes][leader_id]" 
     type="radio" 
     value="2" 
/> 

Таким образом, может быть только один выбранный (через браузеры внутренний механизм кнопки радио) и params[:team][:persons_attributes][:leader_id] будет содержать индекс для params[:team][:persons], который будет имя лидера.

получить идентификатор

team = Team.create(params[:team]) 
params[:team][:persons].each_with_index{|name, idx| 
    person = Persons.create(:name => name) 
    #assuming no errors 
    team.leader_id = person.id if params[:team][:persons_attributes][:leader_id] == idx 
} 
+0

спасибо. Я обновил свой пост. Глупая ошибка, проблема остается. :) – jacob

+0

просто для уточнения: ruby ​​on rails устанавливает team.leader_id в том, что я указал в атрибуте value. В вашем примере это может быть, например, «1», если я выберу второй. Но я действительно хочу иметь идентификатор человека в этом поле, а не 1. – jacob

+0

идентификатор может быть получен с использованием моего примера параметрами [: team] [: persons] [params [: team] [: persons_attributes] [: leader_id]] [: id] - я уточню свой ответ, чтобы объяснить более подробно. –

1

Кажется, как будто вы подаете количество пользователей за один раз с одним из них помечен как лидер команды. В этом случае вы могли бы построить что-то вроде: (?, Используя вложенные атрибуты)

<%= radio_button_tag "[team][leader]","[1]" %> 
<%= radio_button_tag "[team][leader]","[2]" %>> 

Затем в контроллере создают люди, а затем просто посмотреть идентификатор одного помеченного в качестве лидера для записи команды.

+0

спасибо за ваш ответ. – jacob

 Смежные вопросы

  • Нет связанных вопросов^_^