Переход на статическую страницу в феникс-фреймворке

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

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

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


person CoolTapes    schedule 28.04.2015    source источник


Ответы (3)


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

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

  plug :action

  def index(conn, _params) do
    redirect conn, to: "/foobar.html"
  end
end
person José Valim    schedule 04.05.2015
comment
@ jose-valim Я новичок. Я создал root_controller.ex, который выше (с elm == foobar), добавил get "/elm", RootController, :index в router.ex и поместил elm.html в /priv/static и в /web/static, но все, что я получил, это no route found for GET /elm.html (JwtExample.Router). Вы можете расширить свой ответ - person Simon H; 25.04.2016
comment
Современные интерфейсные фреймворки, такие как AngularJS, React или Vue.js, используют продуманный механизм маршрутизатора. Эти системы маршрутизации нуждаются в index.html обслуживании. Я считаю, что это было целью первоначального вопроса. Предоставленный ответ не работает, потому что он отправляет перенаправление HTTP. Следующий ответ работает: https://stackoverflow.com/questions/37924522/render-static-html-page-in-a-controller. - person Jean-Pierre Bécotte; 19.07.2017
comment
Хосе - учитывая возраст этого ответа, будьте благодарны, если бы вы могли поделиться какими-либо новостями о том, есть ли лучший способ через 3 года? Спасибо за любые подсказки - Elixir и Phoenix превосходны - этот вопрос должен быть наиболее часто используемым решением, учитывая распространенность SPA. - person arcseldon; 29.01.2018
comment
Нет, альтернативы пока нет. Кто-то может попробовать запрос функции на Фениксе. - person José Valim; 29.01.2018

В производственной среде многие люди используют 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's 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)
person Matthias Winkelmann    schedule 22.09.2016
comment
Есть ли решение для среды разработки, в которой у вас нет внешнего интерфейса nginx? - person raarts; 31.12.2016
comment
Конечно, тот, который начинается с Иначе ... - person Matthias Winkelmann; 01.01.2017

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

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
person Jean-Pierre Bécotte    schedule 19.07.2017