Я бы не рекомендовал это (я бы рекомендовал иметь два контроллера и переместить вашу логику в другой модуль, который вызывается обоими контроллерами), но это можно сделать. Вы можете совместно использовать контроллер, но вам все равно понадобится отдельный конвейер, чтобы обеспечить правильный тип ответа (html / json).
Следующее будет использовать тот же контроллер и представление, но визуализировать json или html в зависимости от маршрута. «/» - это html, «/ api» - это json.
Маршрутизатор:
defmodule ScopeExample.Router do
use ScopeExample.Web, :router
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
end
pipeline :api do
plug :accepts, ["json"]
end
scope "/", ScopeExample do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
end
scope "/api", ScopeExample do
pipe_through :api # Use the default browser stack
get "/", PageController, :index
end
end
Контроллер:
defmodule ScopeExample.PageController do
use ScopeExample.Web, :controller
plug :action
def index(conn, params) do
render conn, :index
end
end
Вид:
defmodule ScopeExample.PageView do
use ScopeExample.Web, :view
def render("index.json", _opts) do
%{foo: "bar"}
end
end
Вы также можете совместно использовать маршрутизатор и использовать один и тот же маршрут, если вы используете такой маршрутизатор, как:
defmodule ScopeExample.Router do
use ScopeExample.Web, :router
pipeline :browser do
plug :accepts, ["html", "json"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
end
scope "/", ScopeExample do
pipe_through :browser # Use the default browser stack
get "/", PageController, :index
end
end
Затем вы можете указать формат, используя ?format=json
в конце URL-адреса - однако я бы рекомендовал использовать разные URL-адреса для вашего API и сайта.
person
Gazler
schedule
03.06.2015