tôi sẽ không khuyên bạn nên nó (tôi sẽ khuyên bạn nên có hai bộ điều khiển và di chuyển logic của bạn thành một mô-đun khác nhau mà được gọi bằng cả hai bộ điều khiển) nhưng nó có thể được thực hiện . Bạn có thể chia sẻ một bộ điều khiển, nhưng bạn vẫn cần một đường dẫn riêng để đảm bảo loại phản hồi chính xác (html/json) được thiết lập.
Sau đây sẽ sử dụng cùng một bộ điều khiển và chế độ xem, nhưng hiển thị json hoặc html tùy thuộc vào tuyến đường. "/" là html, "/ api" là json.
Router:
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
Bộ điều khiển:
defmodule ScopeExample.PageController do
use ScopeExample.Web, :controller
plug :action
def index(conn, params) do
render conn, :index
end
end
Xem:
defmodule ScopeExample.PageView do
use ScopeExample.Web, :view
def render("index.json", _opts) do
%{foo: "bar"}
end
end
Bạn cũng có thể chia sẻ router và có tất cả mọi thứ được phục vụ bởi các tuyến đường tương tự nếu bạn sử dụng một router như:
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
Sau đó, bạn có thể chỉ định định dạng bằng cách sử dụng ?format=json
ở cuối url - tôi khuyên bạn nên sử dụng các url khác nhau cho API và trang web của mình.
Bạn không cần phải nội suy định dạng, bạn có thể sử dụng nguyên tử cho mẫu và tiêu đề chấp nhận sẽ được sử dụng để hiển thị định dạng chính xác. –
@ChrisMcCord cảm ơn - Tôi đã thử một vài điều và không thể làm cho tiêu đề kiểu nội dung hoạt động. Tôi sẽ cập nhật câu trả lời của mình. – Gazler
@gazler nếu nhiều bộ điều khiển là giải pháp, chúng ta nên đặt tên cho không gian sao cho chúng khác nhau nhưng tách biệt? bộ điều khiển API nên đi vào bộ điều khiển/API/user_controller.exs? – DogEatDog