mrbuchmas
How to enable verified routes? undefined function sigil_p/2
Error when attempting to use verified routes with ~p
Hey there, I’m new to the Elixir/Phoenix eco system, and I’ve been trying to model an application from some code from an online course, but I must have somethings setup wrong, because I get errors when trying to use certain features.
Specifically, I want to use verified routes via ~p and use the <.link> syntax, but I get the following errors:
error: undefined function sigil_p/2 (expected DroneShopWeb.DroneLive to define such a function or for it to be imported, but none are available)
lib/drone_shop_web/live/drone_live.ex:48: DroneShopWeb.DroneLive.render/1
error: undefined function link/1 (expected DroneShopWeb.DroneLive to define such a function or for it to be imported, but none are available)
lib/drone_shop_web/live/drone_live.ex:27: DroneShopWeb.DroneLive.render/1
Here is my code:
defmodule DroneShopWeb.DroneLive do
use DroneShopWeb, :live_view
alias DroneShop.Drones
def mount(_params, _session, socket) do
socket =
assign(socket,
filter: %{type: "", prices: []},
drones: Drones.list_drones()
)
{:ok, socket}
end
def handle_params(%{"id" => id}, _uri, socket) do
drone = Drones.get_drone!(id)
{:noreply, assign(socket, selected_drone: drone, page_title: drone.name)}
end
def handle_params(_params, _uri, socket) do
{:noreply, assign(socket, selected_drone: hd(socket.assigns.drones))}
end
def render(assigns) do
~H"""
<h1 class="text-6xl text-center mb-10">Inventory</h1>
<.filter_form filter={@filter} />
<div class="flex flex-row flex-wrap justify-center">
<%= for drone <- @drones do %>
<div class="max-w-sm rounded overflow-hidden shadow-lg mx-4 mt-3">
<img class="w-full" src={drone.image}>
<.link phx-click="more_info" # patch={~p"/drones?#{[id: drone.id]}"} class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded mt-3">More Info</.link>
<div class="px-6 py-4">
<p class="font-bold text-xl mb-2"><%= drone.model %>
</p>
<p class="text-gray-700 text-base">
<%= drone.description %>
</p>
</div>
</div>
<% end %>
</div>
"""
end
def handle_event("more_info", %{"id" => id}, socket) do
IO.inspect(self(), label: "More Info Click")
drone = Drones.get_drone!(id)
{:noreply, assign(socket, selected_drone: drone, page_title: drone.name)}
end
def filter_form(assigns) do
~H"""
<form phx-change="filter" class="text-center mb-10">
<div class="">
<select name="type" class="rounded-lg">
<%= Phoenix.HTML.Form.options_for_select(
type_options(),
@filter.type
) %>
</select>
<div class="prices">
<%= for price <- ["$", "$$", "$$$"] do %>
<input
class="rounded"
type="checkbox"
name="prices[]"
value={price}
id={price}
checked={price in @filter.prices}
/>
<label for={price}><%= price %></label>
<% end %>
<input type="hidden" name="prices[]" value="" />
</div>
</div>
</form>
"""
end
def handle_event("filter", %{"type" => type, "prices" => prices}, socket) do
filter = %{type: type, prices: prices}
drones = Drones.list_drones(filter)
{:noreply, assign(socket, drones: drones, filter: filter)}
end
def handle_event("filter", %{"id" => id}, socket) do
filter = %{id: id}
drones = Drones.list_drones(filter)
{:noreply, assign(socket, drones: drones, filter: filter)}
end
defp type_options do
[
"All Types": "",
Cinematic: "Cinematic",
FPV: "FPV"
]
end
end
Marked As Solved
sodapopcan
That’s because you ran mix phx.new with version 16 and verified routes did not exist in this version.
If you are in a position where you can start over, you can run mix archive.install hex phx_new which will update your phx_new to use the latest version of Phoenix. Otherwise, just manually update the Phoenix version in your mix.exs and do mix deps.get. You may need to undo the changes you just did first as to avoid a compilation error. You will also probably have to update some other packages as well.
Also Liked
SergeyMoiseev
use DroneShopWeb, :verified_routes
Will do it for you
Eiji
Great, now compare it with what I show. Looks like you have generated the project in earlier version of phoenix and migrated it to newest one. You have not done an optional step, see (optional) Update your app to support Phoenix.VerifiedRoutes
sodapopcan
What version of Phoenix and LiveView are you using? They weren’t available until Phoenix 1.17.







