У меня есть эта схема базы данных для нового пользователя.Как перенести переключатель Phoenix.HTML в базу данных PostgreSQL, но все же делает их группой?
defmodule XYZ.User do
use XYZ.Web, :model
schema "users" do
field :lawyer, :boolean
field :firm, :boolean
field :first_name, :string
field :last_name, :string
field :phone, :string
field :email, :string
timestamps
end
def changeset(model, params \\ :empty) do
model
|> cast(params, [:lawyer, :firm, :first_name, :last_name, :phone, :email])
|> validate_required([:first_name, :last_name, :phone, :email])
end
end
UserController ручки/пользователи/новые, создавая новый пользователь и ревизии передачи его в веб-просмотра/шаблон для рендеринга.
defmodule XYZ.UserController do
use XYZ.Web, :controller
def new(conn, _params) do
changeset = User.changeset(%User{})
render conn, "new.html", changeset: changeset
end
new.html.eex шаблон использует вспомогательную функцию Phoenix.HTML для визуализации адвоката/фирмы в виде двух переключателей.
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= radio_button f, :lawyer, "true", checked: "checked %>
<%= label f, :user_lawyer, "Lawyer" %>
<%= radio_button f, :firm, "true" %>
<%= label f, :user_firm, "Firm" %>
</div>
...
Отображаемый HTML-код для исходного кода выглядит следующим образом.
div class="form-group">
<input checked="checked" id="user_lawyer_true" name="user[lawyer]" type="radio" value="true">
<label for="user_user_lawyer">Lawyer</label>
<input id="user_firm_true" name="user[firm]" type="radio" value="true">
<label for="user_user_firm">Firm</label>
div>
С выше представлением формы сохранит значение истина в столбце в записи базы данных, которая соответствует радио-кнопки, которая была выбрана в виде кода.
Однако два переключателя не функционируют как группа. Можно выбрать оба переключателя, когда нужно выбрать только один.
Изменение вспомогательных функций Phoenix.HTML, добавление имени: «type» к параметрам, сгруппирует два переключателя, но истинное значение выбранного переключателя не сохраняется в базе данных при отправке формы.
Вот модифицированные вспомогательные функции.
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= radio_button f, :lawyer, "true", name: "type", checked: "checked" %>
<%= label f, :user_lawyer, "Lawyer" %>
<%= radio_button f, :firm, "true", name: "type" %>
<%= label f, :user_firm, "Firm" %>
</div>
...
И вот рендеринг HTML для вышеуказанного исходного кода.
div class="form-group">
<input checked="checked" id="user_lawyer_true" name="type" type="radio" value="true">
<label for="user_user_lawyer">Lawyer</label>
<input id="user_firm_true" name="type" type="radio" value="true">
<label for="user_user_firm">Firm</label>
/div>
Как я могу сделать два радио-кнопки ведут себя как группа, все еще сохраняющиеся правильные значения в базе данных?
Я использую следующие версии программного обеспечения:
- Elixir v1.3.4
- Phoenix v1.2.1
- PostgreSQL v9.5.4
Спасибо заранее.
----- РЕШЕНИЕ -----
я в конечном итоге реализации одного из @cpjolicoeur предложений, изменения схемы пользователя, удаление булева адвоката и твердых поля и добавив одну строки поле под названием тип.
schema "users" do
field :type, :string
field :first_name, :string
field :last_name, :string
field :phone, :string
field :email, :string
timestamps
end
Затем я изменил new.html.eex шаблон:
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
<div class="form-group">
<%= radio_button f, :type, "lawyer", checked: "checked" %>
<%= label f, :user_lawyer, "Lawyer" %>
<%= radio_button f, :type, "firm" %>
<%= label f, :user_firm, "Firm" %>
</div>
...
С теми изменениями, которые выбор радио кнопки, «адвокат» или «фирма», сохраняются в поле типа, когда создается новый пользователь.