2015-06-20 8 views
13

Ich habe gerade angefangen, an meiner ersten Phoenix App zu arbeiten, und das Problem ist, dass ich in jeder Aktion in meinem Controller einige gemeinsame Codezeilen habe, die ich gerne trennen würde. Sie holen Daten von mehreren Ecto-Modellen und speichern sie für die Verwendung in Variablen.Rails 'before_filter äquivalent in Phoenix

In Rails, ich könnte einfach eine Methode definieren und rufen Sie before_filter in meinem Controller. Ich könnte auf das Ergebnis von einem @variable zugreifen. Ich verstehe, dass Plugs mit der Schlüssel ist, aber ich bin unklar, wie dies zu erreichen, genauer gesagt:

  • die Anfrage Zugriff auf params von einem Plug
  • und machen die Variablen zugänglich in Aktionen

Als Referenz ist dies die Schienen-Version von dem, was ich versuche zu tun:

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 

Danke!

Antwort

20

Sie können dies tatsächlich mit einem Plug und Plug.Conn.assign erreichen.

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 

Denken Sie daran, den Stecker Erklärung vor Ihrer Aktion Stecker hinzuzufügen, wie sie in der richtigen Reihenfolge ausgeführt werden.

+3

Die gesamte Plug.Conn API ist bereits importiert, Sie können also 'assign (conn,: something,: some_data)' ' –

Verwandte Themen