Подтвердить что ты не робот

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

Спасибо!

4b9b3361

Ответ 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

Не забудьте добавить объявление вилки перед вашим действием, так как они выполняются в порядке.