Единственный известный мне способ сделать это - использовать 2 прицела. Вот пример, в котором я дважды объявляю одну и ту же область видимости, но в одной из них используется дополнительный конвейер :auth
. Обратите внимание, как я использую параметр :only
, чтобы указать, какие методы контроллера разрешены:
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
end
pipeline :auth do
plug MyAppWeb.Auth
end
scope "/", MyAppWeb do
pipe_through :browser
resources "/posts", PostController, only: [:index]
end
scope "/", MyAppWeb do
pipe_through :browser
pipe_through :auth
resources "/posts", PostController, only: [:show, :new, :create]
end
Хитрость заключается в том, чтобы использовать :only
, чтобы сказать, какие из функций вашего контроллера разрешено вызывать в этом путь. Маршрутизатор будет соответствовать первому найденному, поэтому, если вы дважды используете один и тот же метод в обеих областях, скажем :index
, тогда он будет использовать первую область видимости (то есть первую лексически определенную область видимости. файл).
Надеюсь, в этом есть смысл. Я могу объяснить больше, если хотите.
PS Может, поэкспериментируйте и посмотрите, работает ли:
scope "/", MyAppWeb do
pipe_through :browser
resources "/posts", PostController, only: [:index]
pipe_through :auth
resources "/posts", PostController, only: [:show, :new, :create]
end