2015-06-20 10 views
13

Ho appena iniziato a lavorare sulla mia prima app Phoenix e il problema è che ho alcune linee comuni di codice in ogni azione nel mio controller, che vorrei separare. Recuperano i dati da più modelli Ecto e li salvano in variabili da utilizzare.L'equivalente di before_filter di Rails a Phoenix

In Rails, ho potuto semplicemente definire un metodo e chiamarlo usando before_filter nel mio controller. Potrei accedere al risultato da un @variable. Capisco che l'utilizzo Plugs è la chiave, ma io sono poco chiare su come raggiungere questo obiettivo, più precisamente:

  • Accesso alla richiesta di params da un Plug
  • e rendendo le variabili accessibile in azioni

Come riferimento, questa è la versione rotaie di quello che sto cercando di fare:

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 

Grazie!

risposta

20

È possibile raggiungere questo obiettivo con un Plug e 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 

ricordare di aggiungere la dichiarazione di presa prima della presa di azione, in quanto sono eseguite in ordine.

+3

L'intero Plug.Conn api è già importato, quindi è possibile eseguire 'assign (conn,: something,: some_data)' –

Problemi correlati