Phoenix: alias and Model names

I am working on my first Phoenix project.

One thing I do not like right now, is that all models are prefixed with the project name. I can understand that this is nicer from a code-hierarcy perspective (less conflicting module names), but many of my files now look like this:

defmodule MyProject.Foo do
  alias MyProject.{Repo, Something, SomethingElse, YetAnotherModel, Bar, Baz, Qux, ...}
end

Is there a better way?

2 Likes

As far as I understand, it is Elixir naming convention.
I have a lot of same alias App.{Repo, …}, too :slight_smile:

2 Likes

You can see how HexWeb solves it:

8 Likes

@Qqwy, you can use schemaless queries :wink:

2 Likes

One of the things I did not know, and thanks for @wojtekmach for pointing this out to me, is that the web/web.ex is a wonderful file where you can list things that all your models/views/controllers require(/import/use) in a single place.

This makes life already a lot easier. :smiley:

3 Likes

Hi @wojtekmach , the below links that you’ve shared in a previous post as part of this thread don’t seem to work anymore(I’m getting a page not found). If the path has changed to another location in the repo, can you please share the new link ?

Thank you.

@boddhisattva sorry for that! Here’re the updated links:

1 Like

@wojtekmach Thank you very much for your prompt response :slight_smile: . I have a user_profile API only Phoenix 1.3 app(have used options like --no-brunch, --no-html when creating the app via mix phx.new).

I wasn’t able to find functions like def schema within my entire project and also I have my the module names like defmodule UserProfileWeb instead of defmodule Hexpm.Web as per the above link that you’ve shared. I’d like to confirm will the def schema go within the defmodule UserProfileWeb module or do you think it should belong elsewhere ?

def schema in *Web module doesn’t come out of the box in Phoenix, but you should have similar def controller, def view etc somewhere - use the shared trick there.

Thank you @wojtekmach :slight_smile: . def controller, def view etc., are defined as part of defmodule UserProfileWeb, so will definitely add def schema there based on your inputs.

Also just curious, are things different in hex because it’s using an older version of phoenix or is there any other reason to why it’s named defmodule Hexpm.Web when compared to defmodule UserProfileWeb ?

Note that module names are completely arbitrary and there is little/nothing in either Elixir or Phoenix that dictates them, it’s just a matter of convention. It just happens so that at the time I converted to v1.3-like structure the convention in Phoenix release candidate was MyApp.Web, not MyAppWeb :slight_smile:

2 Likes

Thank you for your prompt responses @wojtekmach, it was fun to learn these new things today with the Elixir and Phoenix way of doing things :slight_smile:

1 Like