I currently have a working Phoenix application with a well-defined set of routes. Each route roughly implements a CRUD interface, and the bulk of the code was generated using phx.gen.html.
What is the best practice around adding similar routes for a JSON API?
I would say you definitely want to reuse the existing schemas. In your views you can determine what you return in the JSON response. So if there are values you don’t want to return, don’t include them in the response. If there values from different schemas you want to return in the same response, you need to make an ecto query that joins them.
Yes - Use the --no-context and --no-schema flags. Like this:
mix phx.gen.json Accounts User users --no-context --no-schema
This will look in lib/proj/accounts/user.ex and generate a JSON api route for the schema defined at that file. It will not try to recreate a context module nor a new schema
The order of arguments to the command is:
mix phx.gen.json Context Schema db_table
Context is the phoenix context, Schema is your Elixir schema, and db_table is the table in your database that Schema is linked to
In some cases, you may wish to bootstrap JSON views, controllers, and controller tests, but leave internal implementation of the context or schema to yourself. You can use the --no-context and --no-schema flags for file generation control.
Doing as the accepted solution today will overwrite the phx.gen.html controller file. The json controller will be missing methods as new/2, edit/2. and the remaining create/2, update/2, delete/2 will lose the error render.
I think the solution is to also use the --web parameter, but it doesn’t seem clear from the linked doc above. It will simply create a new sub context. no way to use the same controllers… I am not sure what is the advantage of fiddling with the “app namespace” versus the context.