в `insert` не совпадает тип: integer - PullRequest
1 голос
/ 27 октября 2019

значение "2" для Takso.Sales.Booking.estimated_distance в insert не соответствует типу: целое число

Hello

Я вставляю номер 2 в текстовое поле и нажимаю кнопку отправки.

Я пытаюсь создать поле ввода текста и добавить целое значение 2 в базу данных. Почему происходит эта ошибка? Я не понимаю, нет документации или примеров, как создать текстовое поле, которое принимает цифры, пожалуйста, помогите. Попытка найти информацию за последние 4 часа и ничего: (

new.html.eex

  <div class="form-group">
    <%= text_input booking, :estimated_distance, id: "estimated_distance", class: "form-control" %>
  </div>

booking.ex

  schema "bookings" do
    field :estimated_distance, :integer
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:estimated_distance])
    |> validate_required([:estimated_distance])
  end

booking_controller.ex

  def new(conn, _params) do
    changeset = Booking.changeset(%Booking{}, %{})
    render conn, "new.html", changeset: changeset
  end


def create(conn, %{"booking" => booking_params}) do
   changeset = Booking.changeset(booking_struct, %{})
   booking = Repo.insert!(changeset)
end

Ответы [ 2 ]

0 голосов
/ 29 октября 2019
<%= number_input booking, :distance, id: "distance", class: "form-control" %>

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

Внутри booking_controller.ex

До:

  def create(conn, %{"booking" => booking_params}) do

    booking_struct = Ecto.build_assoc(user, :bookings, Enum.map(booking_params, fn({key, value}) -> {String.to_atom(key), value} end))   
    changeset = Booking.changeset(booking_struct, %{})
                |> Changeset.put_change(:status, "open")

    booking = Repo.insert!(changeset)

ПОСЛЕ:

  def create(conn, %{"booking" => booking_params}) do

    booking_struct = Ecto.build_assoc(user, :bookings, Enum.map(booking_params, fn({key, value}) -> {String.to_atom(key), value} end))
    {d, _} = Integer.parse(booking_params["distance"])   
    changeset = Booking.changeset(booking_struct, %{})
                |> Changeset.put_change(:status, "open")
                |> Changeset.put_change(:distance, d)

    booking = Repo.insert!(changeset)
0 голосов
/ 27 октября 2019

оценка_дистанция равно целое число

  schema "bookings" do
    field :estimated_distance, :integer
    timestamps()
  end

Но параметры ввода возвращают строковый тип. Для этого он говорит, что «2» не соответствует целому числу.

Поэтому я предлагаю синтаксический анализ параметра до целого числа, используя Integer.parse / 2 или изменяя поле: оценочное_дистанционное, : строка для простого

...