Rails 'before_filter эквивалент в Phoenix
Я только начал работать над своим первым приложением Phoenix, и проблема в том, что у меня есть некоторые общие строки кода во всех действиях в моем контроллере, которые я хотел бы выделить. Они извлекают данные из нескольких моделей Ecto и сохраняют их в переменных для использования.
В Rails я мог просто определить метод и вызвать его с помощью before_filter
в моем контроллере. Я мог получить результат из @variable
. Я понимаю, что использование Plugs
- это ключ, но я не понимаю, как это сделать, а точнее:
- Доступ к запросу
params
из Plug
- и превращение переменных в действия
Как ссылка, это версия rails того, что я пытаюсь сделать:
class ClassController < ApplicationController
before_filter :load_my_models
def action_one
# Do something with @class, @students, @subject and @topics
end
def action_two
# Do something with @class, @students, @subject and @topics
end
def action_three
# Do something with @class, @students, @subject and @topics
end
def load_my_models
@class = Class.find params[:class_id]
@subject = Subject.find params[:subject_id]
@students = @class.students
@topics = @subject.topics
end
end
Спасибо!
Ответы
Ответ 1
Вы действительно можете добиться этого с помощью Plug
и Plug.Conn.assign.
defmodule TestApp.PageController do
use TestApp.Web, :controller
plug :store_something
plug :action
def index(conn, _params) do
IO.inspect(conn.assigns[:something]) # => :some_data
render conn, "index.html"
end
defp store_something(conn, _params) do
assign(conn, :something, :some_data)
end
end
Не забудьте добавить объявление вилки перед вашим действием, так как они выполняются в порядке.