17

最初の Phoenix アプリの作業を開始したばかりですが、問題は、コントローラーのすべてのアクションに共通のコード行がいくつかあることです。これを分離したいと考えています。複数の Ecto モデルからデータを取得し、変数に保存して使用します。

before_filterRails では、単純にメソッドを定義し、それをコントローラーで使用して呼び出すことができました。から結果にアクセスできました@variable。使用が鍵であることは理解してPlugsいますが、これを達成する方法、より具体的には不明です。

  • paramsからのリクエストへのアクセスPlug
  • アクションで変数にアクセスできるようにする

参考までに、これは私がやろうとしていることのレールバージョンです:

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

ありがとう!

4

2 に答える 2

25

これは実際に aPlugPlug.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

アクション プラグは順番に実行されるため、アクション プラグの前にプラグ宣言を追加することを忘れないでください。

于 2015-06-20T22:20:25.220 に答える