Mongoid, логические поля формы

Так что это своего рода вопрос о том, как структурировать логические выборки, и сами поля формы. Например, если пользователь при регистрации должен выбрать команду (и в демонстрационных целях), такую ​​как "волшебник" или "лучник", так что я должен иметь:

field :wizard, type: Boolean
field :archer, type: Boolean

Однако они могут быть только одной или другой, так как я могу структурировать свои формы с помощью радиополей, чтобы пользователи могли выбирать только одну или другую, я не уверен, правильно ли я делаю это, поэтому в своей форме скажу: иметь что-то вроде:

<p><%= f.label "wizard" %><%= radio_button(:user, :wizard, "True") %></p>
<p><%= f.label "archer" %><%= radio_button(:user, :archer, "True") %></p>

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

1 ответ

Решение

Радиокнопки не совсем работают в разных полях HTML. Чтобы их можно было связать так, чтобы вы могли выбрать только один, они должны иметь одинаковое значение для атрибута name. Ваши генерируются со значениями имени "user.wizard" и "user.archer". Вам нужно что-то вроде:

<p><%= f.label "wizard" %><%= radio_button(:user, :role, "wizard") %></p>
<p><%= f.label "archer" %><%= radio_button(:user, :role, "archer") %></p>

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

В целом, я бы порекомендовал изменить вашу модель данных, чтобы она играла роль строкового поля, или нормализовал и сделал бы role_id реальным полем, указывая на отдельную таблицу, в которой содержались роли (user assign_to:role, role has_many:users). Таким образом, если вы добавите новую роль, вам не нужно будет менять код, просто добавьте строку в таблицу. В модели User все еще могут быть булевы методы (например, user.is_wizard?), Но они будут рассчитываться на основе роли.

Другие вопросы по тегам