Хитрый рубин на рельсах. Существует ли простое решение? - PullRequest
0 голосов
/ 08 августа 2009

Надеюсь, мой вопрос понятен, иначе я рад уточнить.

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

Факты:

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

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

  1. o [____Write first name here___] <--- это текстовое поле </em>
  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.

Мой вопрос: что мне поставить на **????**?

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

Остальное не нужно читать (оно описывает хак, который я использую)

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

params[:team][:leader_id].

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

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

Ответы [ 2 ]

2 голосов
/ 08 августа 2009

Радиоприемники должны иметь одно и то же имя, т.е.

<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
}
1 голос
/ 08 августа 2009

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

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

Затем в контроллере создайте людей (используя вложенные атрибуты?), Затем просто найдите идентификатор человека, помеченного как лидер для записи команды.

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