2015-12-25 25 views
5

我幾乎所有的控制器都需要以下功能。 Elixir中是否有類似於ApplicationController的模塊?Elixir鳳凰哪裏應該放一個全局控制器幫手

我們應該把這些放在哪裏?

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 

回答

7

正如一條路可走,你可以創建一個單獨的模塊,並在web.ex文件中controller功能導入。

像這樣:

defmodule MyApp.Web do 

# Some code... 

    def controller do 
    quote do 

     # Some code ... 

     import MyApp.CustomFunctions 

     # Some code ... 

    do 
    end 

# Some code... 

end 
+0

是否有關於模塊位置的約定? – Chris

+0

@Chris我不確定,我想你可以把它放在任何你認爲你應該的地方。雖然可能在'web'文件夾中,所以它會被重新加載。 – JustMichael

+0

好的謝謝。我現在把一些代碼放在controllers/helper和views/helpers中,看起來很好! – Chris

3

通常這些將是一個插件內,添加到你的路由的管道。

這個例子是在編程鳳凰用於:

  • 他們定義Rumbl.Auth模塊與authenticate_user功能
  • 他們包括在他們的路由器插頭通過import Rumbl.Auth, only: [authenticate_user: 2]
  • 他們然後通過管道請求通過它 - pipe_through [:browser, :authenticate_user]