laurenfackler
Dev-only routes
To quickly test changes to email template copy and styling, I created a couple routes that are only accessible in the dev environment:
if Mix.env() == :dev do
get("/email_previews", EmailPreviewController, :index)
get("/email_previews/:email", EmailPreviewController, :show)
end
However, this now means that there is a template file that references a path helper function that doesn’t exist in other environments:
<ul>
<%= for email <- @emails do %>
<li><a href="<%= email_preview_path(@conn, :show, to_string(email)) %>"><%= email %></a></li>
<% end %>
</ul>
which prevents the app from compiling:
** (CompileError) lib/my_app_web/templates/email_preview/index.html.eex:9: undefined function email_preview_path/3
How can I get the app to compile?
Marked As Solved
andrejsm
Simply don’t use the compiled path functions. Instead type them as strings and interpolate values.
Also Liked
mudasobwa
When one needs different modules to be compiled in different environments, it’d be better to explicitly define these module sets, instead of polluting the source code with conditionals.
For the modules to be available in :test only, the common approach is to create test/support folder, and modify your mix.exs in the following way:
- Create a private function like this:
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
- Modify your
Mix.Project.project/0callback to include the following key/value pair:
elixirc_paths: elixirc_paths(Mix.env())
- Put all the files containing modules needed only in
testenvironment there.
That way all of them will be compiled in test and discarded in all other environments.
If you need some modules to exist in :prod only, declare compile paths appropriately.
benwilson512
Right, the if Mix.env == :dev do call in the router happens at compile time because it’s in the module body.
benwilson512
You don’t want to do Mix.env calls at runtime. Does the email_preview_path exist in a view that only is needed in dev?
Last Post!
laurenfackler
Right, yes. I am already using that feature of Swoosh. However, I wanted a slightly different solution where I could quickly preview any email without having to manually go through the user flows within my application (e.g. filling out forms). Unless, I’m completely missing something in the README…
What I created, allows me to visit http://localhost:4000/email_previews and see a list of links to preview all my apps emails:
- appointment_booked_patient
- appointment_booked_practice
- confirmation
- duplicate_locations
- new_app_version
- password
- unlock
- user_registered_admin
- welcome
- etc
I also created a gist for anyone else who might stumble across this thread and want the same:
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









