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

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
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
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement