2017-02-19 12 views
0

У меня есть эта схема базы данных для нового пользователя.Как перенести переключатель 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> 
    ... 

С теми изменениями, которые выбор радио кнопки, «адвокат» или «фирма», сохраняются в поле типа, когда создается новый пользователь.

ответ

0

Я думаю, что, вероятно, есть несколько возможностей.

Во-первых, вы можете изменить атрибут value элементов <radio />, чтобы иметь разные значения. Прямо сейчас они оба имеют значение true, что означает независимо от того, какой из них выбран, параметр «type», который отправляется на ваш контроллер, всегда будет иметь значение true, что означает, что вы не знаете, какой переключатель был выбран. Вы можете изменить значения как-то вроде value="firm" и value="lawyer", так что параметр «type» в контроллере вместо этого будет удерживать строку «фирма» или «юрист», а не всегда «истина».

Второй вариант приходит на ум, хотя, если это действительно взаимоисключающие опции. Просто сохраните один столбец в базе данных вместо двух. Это может произойти в нескольких возможных заклинаниях.

  • Может boolean колонка называется lawyer, что является истинным, если они являются адвокатом, а если ложно, то вы знаете, что они являются firm вместо этого. В этом случае кнопка радио для lawyer бы value="true" и радио-кнопка для firm будет иметь value="false"
  • Измените поле базы данных в enum типа, где карта значения для известных типов (адвокатов, фирм и т.д. ...) Это позволит вам также расширить список типов в будущем, если вам нужно. Тогда ваши значения переключателя являются только значениями «перечисления», которые вы используете.

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

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