【问题标题】:Rails' before_filter equivalent in Phoenix凤凰城中 Rails 的 before_filter 等价物
【发布时间】:2015-09-06 15:14:42
【问题描述】:

我刚刚开始开发我的第一个 Phoenix 应用程序,问题是我的控制器中的每个操作都有一些共同的代码行,我想将它们分开。他们从多个 Ecto 模型中获取数据并将其保存到变量中以供使用。

在 Rails 中,我可以简单地定义一个方法并在我的控制器中使用 before_filter 调用它。我可以从@variable 访问结果。我知道使用Plugs 是关键,但我不清楚如何实现这一点,更具体地说:

  • Plug 访问请求params
  • 并使变量在操作中可访问

作为参考,这是我正在尝试做的 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

谢谢!

【问题讨论】:

    标签: ruby-on-rails elixir phoenix-framework


    【解决方案1】:

    您确实可以通过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
    

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

    【讨论】:

    • 整个Plug.Conn api已经导入,可以assign(conn, :something, :some_data)
    【解决方案2】:

    作为评论更好,但我缺乏代表;对于当前版本的 Phoenix(1.3.4,2018 年 8 月),如果您使用最佳答案的代码,您只想执行 plug :store_somethingnot 按原样使用 plug :action多余的。操作将在您列出的插件之后运行。

    如果您包含plug :action,您将获得(Plug.Conn.AlreadySentError) the response was already sent,因为该操作将运行两次,Phoenix 会生您的气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2016-09-16
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      相关资源
      最近更新 更多