hector97rch

hector97rch

Error rendering view, implementing the many function

Hi I’m new to elixir and I have a problem when i render one view using many, all of this happens when I call get_users the error its this:

# Could not render "usuario.json" for UsuariosWeb.UserView, please define a matching clause for render/2 or define a template at "lib/usuarios_web/templates/user/*". No templates were compiled for this module. Assigns:

my view its this:

defmodule UsuariosWeb.UserView do

  use UsuariosWeb, :view

  def render("usuarios.json", %{usuarios: usuarios}) do

    %{usuarios: render_many(usuarios, UsuariosWeb.UserView, "usuario.json")}

  end

  def render("usuario.json", %{usuario: usuario}) do

      %{

          id: usuario.id,

          name: usuario.name,

          email: usuario.email,

          estado: usuario.estado

      }

  end

end

and my contoller its this:

def show_usuarios(conn, _params) do

    usuarios = Usuarios.User.buscar_usuarios()

    case usuarios != [] do

        true ->

          conn

            |>put_status(200)

            |> put_resp_content_type("application/json")

            |>render("usuarios.json", %{usuarios: usuarios})

        false ->

          {:error, "no hay usuarios"}

    end

  end

  def show_usuario(conn, %{"id" => id}) do

      case Usuarios.User.buscar_usuario(id) do

        nil->

          {:error, "usuario no encontrado!"}

        usuario->

          conn

            |> put_status(200)

            |> render("usuario.json", %{usuario: usuario})

      end

  end

Most Liked

stefanchrobot

stefanchrobot

Try this:

%{usuarios: render_many(usuarios, UsuariosWeb.UserView, "usuario.json", as: :usuario)}

From the docs:

The underlying user is passed to the view and template as :user , which is inferred from the view name.

which means that

%{usuarios: render_many(usuarios, UsuariosWeb.UserView, "usuario.json")}

is equivalent to:

Enum.map(usuarios, fn user ->
  render(UserView, "usuario.json", user: user)
end)

because your view is named UserView.

As a side not, I think you can just use if in your controllers:

if usuario = Usuarios.User.buscar_usuario(id) do
  # conn ...
else
  {:error, "usuario no encontrado!"}
end

Last Post!

stefanchrobot

stefanchrobot

Here’s a full working example. Can you please check against your code? You can run this with elixir server.ex:

Application.put_env(:phoenix, :json_library, Jason)
Application.put_env(:sample, UsuariosWeb.Endpoint, [
  http: [ip: {127, 0, 0, 1}, port: 5001],
  server: true,
  secret_key_base: String.duplicate("a", 64),
  render_errors: [view: UsuariosWeb.ErrorView, accepts: ~w(html json), layout: false],
])

Mix.install([
  {:plug_cowboy, "~> 2.5"},
  {:jason, "~> 1.0"},
  {:phoenix, "~> 1.6"},
  {:phoenix_html, "~> 3.1"},
])

defmodule UsuariosWeb.UserView do
  use Phoenix.View, root: ""
  import Phoenix.View

  def render("usuarios.json", %{usuarios: usuarios}) do
    %{usuarios: render_many(usuarios, UsuariosWeb.UserView, "usuario.json", as: :usuario)}
  end

  def render("usuario.json", %{usuario: _usuario}) do
    %{
      ok: true
    }
  end
end

defmodule UsuariosWeb.UserController do
  use Phoenix.Controller

  def show_usuarios(conn, _params) do
    usuarios = [1, 2, 3]

    case usuarios != [] do
        true ->
          conn
            |> put_status(200)
            |> put_resp_content_type("application/json")
            |> render("usuarios.json", %{usuarios: usuarios})
        false ->
          {:error, "no hay usuarios"}
    end
  end
end

defmodule UsuariosWeb.ErrorView do
  use Phoenix.View, root: ""

  # By default, Phoenix returns the status message from
  # the template name. For example, "404.html" becomes
  # "Not Found".
  def template_not_found(template, _assigns) do
    Phoenix.Controller.status_message_from_template(template)
  end

end

defmodule Router do
  use Phoenix.Router

  pipeline :browser do
    plug :accepts, ["html"]
  end

  scope "/", UsuariosWeb do
    pipe_through :browser

    get "/usuarios", UserController, :show_usuarios

    # Prevent a horrible error because ErrorView is missing
    get "/favicon.ico", UserController, :show_usuarios
  end
end

defmodule UsuariosWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :sample
  plug Router
end

{:ok, _} = Supervisor.start_link([UsuariosWeb.Endpoint], strategy: :one_for_one)
Process.sleep(:infinity)

Where Next?

Popular in Questions Top

vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New

Other popular topics Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 54996 245
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New

We're in Beta

About us Mission Statement