bocaj

bocaj

I am trying to make a liveview form with complex validation. Below is an outline of what the form looks like on the page.

build a questionaire:
    custom questions:
        |text field| |delete button|
        |text field| |delete button|
        ...
        |"add" button|
    prebuilt questions:
        category 1:
            |checkbox for selecting question|, question text
            |checkbox for selecting question|, question text
            ...
        category 2:
            |checkbox for selecting question|, question text
            |checkbox for selecting question|, question text
            ...
        ...

There needs to be a limit on the total number of questions on the questionaire. There also needs to be a limit on the total number of questions in each group. For instance, a maximum of 3 custom questions, a maximum of 2 category_1 questions, etc.

I tried to implement a proof of concept form using inputs_for and a schema that looks like this:

defmodule QuestionaireBuilderSchema do
  use Ecto.Schema
  import Ecto.Changeset

  embedded_schema do
    embeds_one :questionaire, Questionaire do
      embeds_many :custom_questions, CustomQuestion do
        field :text, :string
      end

      embeds_many :category1_questions, Cat1Question, on_replace: :delete do
        field :text, :string
        field :selected, :boolean
      end

      embeds_many :category2_questions, Cat2Question, on_replace: :delete do
        field :text, :string
        field :selected, :boolean
      end
    end
  end

  def changeset(qbs, attrs) do
    qbs
    |> cast(attrs, [])
    |> cast_embed(:questionaire, with: &questionaire_changeset/2)
    |> custom_validation_max_total(:questionaire, max: 10)
  end

  def questionaire_changeset(questionaire, attrs) do
    questionaire
    |> cast(attrs, [])
    |> cast_embed(:custom_questions, with: &custom_question_changeset/2)
    |> cast_embed(:category1_questions, with: &cat_question_changeset/2)
    |> cast_embed(:category2_questions, with: &cat_question_changeset/2)
    |> custom_validate_num_selected(:custom_questions, max: 3, min: 0)
    |> custom_validate_num_selected(:category1, max: 2, min: 1)
  end

  def custom_question_changeset(question, attrs) do
    question
    |> cast(attrs, [:text])
    |> validate_required([:text])
  end

  def cat_question_changeset(question, attrs) do
    question
    |> cast(attrs, [:text, :selected])
  end
end

but one issue was the ability to add, edit, and remove the custom questions. The beginning of the article below describes the issue I had and suggests using individual forms for each question:

That worked great but I’m not sure how to cleanly validate the whole questionnaire since the individual questions now have their own forms. I should mention that, despite the title of the article I linked, this is not a question about how to solve this problem while also implementing liveview streams (although that would be an interesting question on its own).

To summarize, I feel like I could figure out how to make it work as a single form or as one form per question(potentially with liveview streams as well). But I wonder if anyone has any suggestions on what path they would take.

For reference I am on the latest versions of phoenix(1.7) and liveview(0.20).

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews