在凤凰城的Rails'fore_filter等价物

She*_*yar 13 ruby-on-rails elixir phoenix-framework

我刚刚开始研究我的第一个凤凰应用程序,问题是我的控制器中的每个操作都有一些共同的代码行,我想分开.他们从多个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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Paw*_*rok 21

您确实可以使用PlugPlug.Conn.assign实现此目的.

defmodule TestApp.PageController do
  use TestApp.Web, :controller

  plug :store_something
  # This line is only needed in old phoenix, if your controller doesn't
  # have it already, don't add it.
  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
Run Code Online (Sandbox Code Playgroud)

请记住在动作插件之前添加插件声明,因为它们是按顺序执行的.

  • 整个Plug.Conn api已经导入了,所以你可以`assign(conn,:something,:some_data)` (3认同)