Phoenix: mix phx.routes no longer reports route collisions

Created on 25 Aug 2017  ·  14Comments  ·  Source: phoenixframework/phoenix

Environment

  • Elixir version (elixir -v):

    elixir -v
    Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
    
    Elixir 1.5.1
    
  • Phoenix version (mix deps):
    file_system 0.1.5 connection 1.0.4 gettext 0.13.1 ranch 1.3.2 poolboy 1.5.1 decimal 1.4.0 poison 3.1.0 db_connection 1.1.2 phoenix_pubsub 1.0.2 cowlib 1.0.2 cowboy 1.1.2 mime 1.1.0 plug 1.4.3 phoenix_html 2.10.4 phoenix 1.3.0 phoenix_live_reload 1.1.0 mariaex 0.8.3 ecto 2.2.0 phoenix_ecto 3.2.3
  • NodeJS version (node -v): v8.4.0
  • NPM version (npm -v): 5.3.0
  • Operating system: macOS 10.12.6

Expected behavior

To get a warning similar to this

warning: this clause cannot match because a previous clause at line 16 always matches

Actual behavior

No Warning is produced when defining conflicting routes:

  scope "/admin", HelloWeb.Admin, as: :admin do
    pipe_through :browser

    resources "/reviews", ReviewController
  end

  scope "/admin", Something, as: :something do
    resources "/reviews", ReviewController
  end

mix phx.routes produces:

mix phx.routes
Compiling 8 files (.ex)
    admin_review_path  GET     /admin/reviews                  HelloWeb.Admin.ReviewController :index
    admin_review_path  GET     /admin/reviews/:id/edit         HelloWeb.Admin.ReviewController :edit
    admin_review_path  GET     /admin/reviews/new              HelloWeb.Admin.ReviewController :new
    admin_review_path  GET     /admin/reviews/:id              HelloWeb.Admin.ReviewController :show
    admin_review_path  POST    /admin/reviews                  HelloWeb.Admin.ReviewController :create
    admin_review_path  PATCH   /admin/reviews/:id              HelloWeb.Admin.ReviewController :update
                       PUT     /admin/reviews/:id              HelloWeb.Admin.ReviewController :update
    admin_review_path  DELETE  /admin/reviews/:id              HelloWeb.Admin.ReviewController :delete
something_review_path  GET     /admin/reviews                  Something.ReviewController :index
something_review_path  GET     /admin/reviews/:id/edit         Something.ReviewController :edit
something_review_path  GET     /admin/reviews/new              Something.ReviewController :new
something_review_path  GET     /admin/reviews/:id              Something.ReviewController :show
something_review_path  POST    /admin/reviews                  Something.ReviewController :create
something_review_path  PATCH   /admin/reviews/:id              Something.ReviewController :update
                       PUT     /admin/reviews/:id              Something.ReviewController :update
something_review_path  DELETE  /admin/reviews/:id              Something.ReviewController :delete

no error or warning are produced

Most helpful comment

Good news: it is fixed in Elixir master and the v1.5 branch. I plan to release v1.5.3 with a fix this or next week.

All 14 comments

the warning will only be produced the first time you compile the module with duplicate routes. Can you modify the router file ($ touch lib/.../router.ex and rerun the command? You should then see the warning.

I saw a warning yesterday on a new project, so it definitely works.

Yeah, sorry... still not working on my machine. So @PhillippOhlandt is there anything different about my stated versions than yours?

➤ touch lib/hello_web/router.ex
➤ mix phx.routes
Compiling 8 files (.ex)
            page_path  GET     /                               HelloWeb.PageController :index
           hello_path  GET     /hello                          HelloWeb.HelloController :index
           hello_path  GET     /hello/:messenger               HelloWeb.HelloController :show
            user_path  GET     /users                          HelloWeb.UserController :index
            user_path  GET     /users/:id/edit                 HelloWeb.UserController :edit
            user_path  GET     /users/new                      HelloWeb.UserController :new
            user_path  GET     /users/:id                      HelloWeb.UserController :show
            user_path  POST    /users                          HelloWeb.UserController :create
            user_path  PATCH   /users/:id                      HelloWeb.UserController :update
                       PUT     /users/:id                      HelloWeb.UserController :update
            user_path  DELETE  /users/:id                      HelloWeb.UserController :delete
       user_post_path  GET     /users/:user_id/posts           HelloWeb.PostController :index
       user_post_path  GET     /users/:user_id/posts/:id/edit  HelloWeb.PostController :edit
       user_post_path  GET     /users/:user_id/posts/new       HelloWeb.PostController :new
       user_post_path  GET     /users/:user_id/posts/:id       HelloWeb.PostController :show
       user_post_path  POST    /users/:user_id/posts           HelloWeb.PostController :create
       user_post_path  PATCH   /users/:user_id/posts/:id       HelloWeb.PostController :update
                       PUT     /users/:user_id/posts/:id       HelloWeb.PostController :update
       user_post_path  DELETE  /users/:user_id/posts/:id       HelloWeb.PostController :delete
    admin_review_path  GET     /admin/reviews                  HelloWeb.Admin.ReviewController :index
    admin_review_path  GET     /admin/reviews/:id/edit         HelloWeb.Admin.ReviewController :edit
    admin_review_path  GET     /admin/reviews/new              HelloWeb.Admin.ReviewController :new
    admin_review_path  GET     /admin/reviews/:id              HelloWeb.Admin.ReviewController :show
    admin_review_path  POST    /admin/reviews                  HelloWeb.Admin.ReviewController :create
    admin_review_path  PATCH   /admin/reviews/:id              HelloWeb.Admin.ReviewController :update
                       PUT     /admin/reviews/:id              HelloWeb.Admin.ReviewController :update
    admin_review_path  DELETE  /admin/reviews/:id              HelloWeb.Admin.ReviewController :delete
something_review_path  GET     /admin/reviews                  Something.ReviewController :index
something_review_path  GET     /admin/reviews/:id/edit         Something.ReviewController :edit
something_review_path  GET     /admin/reviews/new              Something.ReviewController :new
something_review_path  GET     /admin/reviews/:id              Something.ReviewController :show
something_review_path  POST    /admin/reviews                  Something.ReviewController :create
something_review_path  PATCH   /admin/reviews/:id              Something.ReviewController :update
                       PUT     /admin/reviews/:id              Something.ReviewController :update
something_review_path  DELETE  /admin/reviews/:id              Something.ReviewController :delete
                       *       /jobs                           BackgroundJob.Plug []

clearly there are duplicate routes here, and clearly there is no warning, even after touching the file.

I mean, I noticed this bug when I was following the tutorial and it was telling me about duplicate route warnings and when I did as the tutorial stated, it didn't warn the first or any other time, so I came up with this example to show the issue.

Close it if you like, but it's no longer working. I remember it worked when I tried Phoenix out about a year ago, but never got to do much more than the tutorial, so I started over because it's been so long.

The behavior has changed or something about a fresh install is causing issues, or maybe it's just something with my shell, for all I know. If I knew how to debug it, I would give you more information.

@RobertDeRose Maybe you hit an edge case. I think it would be the best if you could provide an example git repo with the issue so we can try on our machines.

Can you include your complete router?

I'm also having the same issue as @RobertDeRose. Here is my router which is primarily from following the tutorial.

defmodule HelloWeb.Router do
  use HelloWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", HelloWeb do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/hello", HelloController, :index
    get "/hello/:messenger", HelloController, :show
    resources "/reviews", ReviewController
    resources "/users", UserController do
      resources "/posts", PostController
    end

    get "/hello", ByeController, :index
  end

  scope "/", HelloWeb do
    pipe_through :browser

    get "/", PageController, :index
  end

  scope "/admin", HelloWeb.Admin, as: :admin do
    pipe_through :browser

    resources "/reviews", ReviewController
  end
end

@chrismccord what @frankmariette included is equal to what I had while following the tutorial

This is potentially an issue related to elixir versions. I'll investigate.

Hitting this issue:

~/hello
❯ mix compile
Compiling 1 file (.ex)

~/hello
❯ mix phx.routes
Compiling 8 files (.ex)
page_path GET / HelloWeb.PageController :index
root_path GET / HelloWeb.RootController :index
hello_path GET /hello HelloWeb.HelloController :index
hello_path GET /hello/:messenger HelloWeb.HelloController :show

~/hello
❯ mix phoenix.new -v
Phoenix v1.3.0

~/hello
❯ elixir -v
Erlang/OTP 20 [erts-9.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.5.1

This is an issue in Elixir and should be fixed in the next release. You can check the process here https://github.com/elixir-lang/elixir/issues/6637

@chrismccord should the guides be updated while this is being updated?

I believe it only affects Elixir 1.5 and will be fixed in 1.6 so I think we can hold off

Good news: it is fixed in Elixir master and the v1.5 branch. I plan to release v1.5.3 with a fix this or next week.

Thanks @josevalim and @chrismccord for looking into this and getting it fixed.

Was this page helpful?
0 / 5 - 0 ratings