2015-12-25 17 views
5

Potrzebuję następujące funkcje w prawie wszystkich kontrolerów. Czy w Elixir istnieje moduł podobny do ApplicationController?Elixir phoenix gdzie należy umieścić globalnych kontrolerów pomocników

Gdzie powinniśmy je umieścić?

def redirect_if_unauthorized(conn = %Plug.Conn{assigns: %{authorized: false}}, opts) do 
    conn 
    |> put_flash(:error, "You can't access that page!") 
    |> redirect(to: "/") 
    |> halt 
    end 

    def redirect_if_unauthorized(conn = %Plug.Conn{assigns: %{authorized: true}}, opts), do: conn 

Odpowiedz

7

Jako jeden droga, można utworzyć oddzielny moduł i zaimportować go w pliku w funkcji controllerweb.ex.

Jak to:

defmodule MyApp.Web do 

# Some code... 

    def controller do 
    quote do 

     # Some code ... 

     import MyApp.CustomFunctions 

     # Some code ... 

    do 
    end 

# Some code... 

end 
+0

Czy istnieje konwencja dotycząca lokalizacji modułu? – Chris

+0

@Chris Nie jestem pewien, myślę, że możesz umieścić to gdziekolwiek myślisz, że powinieneś. Prawdopodobnie w folderze 'web', więc zostanie przeładowany. – JustMichael

+0

Ok dzięki. Umieściłem trochę kodu w kontrolerach/pomocnikach i widokach/pomocnikach na teraz, wydaje się dobrze! – Chris

3

Zazwyczaj te byłyby wewnątrz Plug, dodany do trasy rurociągu.

Przykład ten stosowano w programowaniu Phoenix:

  • definiują moduł Rumbl.Auth z funkcją authenticate_user
  • one wtyczki w swoim routerem za import Rumbl.Auth, only: [authenticate_user: 2]
  • Następnie żądania rur przez to - pipe_through [:browser, :authenticate_user] .
Powiązane problemy