Маршрут к статической странице в феникс-структуре

Я хочу запустить угловую переднюю часть с фениксом для моего сайта. Я хотел бы, чтобы мой корневой маршрут направлял пользователя на предварительно созданную страницу в статическом каталоге, который содержит мой клиент angular, а затем использует phoenix для запуска API. Я сделал это в прошлом с рубинами на рейках по маршруту, подобным этому:

get '/', to: redirect('/foobar.html')  

Есть ли способ сделать что-то подобное с фениксом?

Ответ 1

Не сейчас. Вам необходимо создать контроллер, а затем в контроллере:

defmodule MyApp.RootController do
  use MyApp.Web, :controller

  plug :action

  def index(conn, _params) do
    redirect conn, to: "/foobar.html"
  end
end

Ответ 2

В производстве многие люди используют nginx или другие серверы из своего приложения, и эти серверы должны обрабатывать статические активы. Найти индекс можно с помощью правила местоположения, например:

location / {
    try_files $uri $uri/index.html @proxy;
}

В противном случае, это решение, которое отображает запрос к корневому пути к index.html с помощью короткого функционального модуля, который можно добавить в ваш endpoint.ex без использования контроллеров:

def redirect_index(conn = %Plug.Conn{path_info: []}, _opts) do
    %Plug.Conn{conn | path_info: ["index.html"]}
end

def redirect_index(conn, _opts) do
    conn
end

plug :redirect_index

# This is Phoenix standard configuration of Plug.Static with
# index.html added.

plug Plug.Static,  
    at: "/", from: :phoenix_elm_starter_template, gzip: false,
    only: ~w(css fonts index.html images js favicon.ico robots.txt)

Ответ 3

От ответа от Jose, я немного изменил бы его, чтобы он служил непосредственно в файле index.html вместо отправки HTTP-ответа 3xx.

defmodule MyApp.RootController do
  use MyApp.Web, :controller

  plug :action

  def index(conn, _params) do
    conn
    |> put_resp_header("content-type", "text/html; charset=utf-8")
    |> Plug.Conn.send_file(200, "priv/static/index.html")
  end
end