2015-11-23 13 views
10

Sto cercando di ottenere l'identificatore di un sito Web in base al suo dominio, ma dopo averne scritto uno, sto correndo in un problema in cui tutti i link nel sistema stanno restituendo il contenuto dell'URL di root .Elixir Phoenix variabile globale plug

lib/frontend/spine/request_var.ex

defmodule Myapp.Plug.RequestVar do 
    import Plug.Conn 

    @doc false 
    def init(default), do: default 

    @doc false 
    def call(conn, router) do 
    host = conn.host 
    if host == "ll.com" || host == "domain1.com" do 
     slug = "domain1" 
    else 
     slug = "domain2" 
    end 

    conn |> put_private(:site_slug, slug) 
    end 
end 

in lib/frontend/endpoint.ex

plug Myapp.Plug.RequestVar, Myapp.Router 
plug Myapp.Router 

sia qualcosa di sbagliato con questo plug?

Modifica: Risolto il problema "se" in base alle risposte.

risposta

6

Il url è generato dal vostro endpoint.url e non host per il Plug.Conn

Da https://github.com/phoenixframework/phoenix/blob/8fe0538fd7be2adb05e2362b02fa8bd6bf3c6c46/lib/phoenix/router/helpers.ex#L13:

def url(_router, %Conn{private: private}) do 
    private.phoenix_endpoint.url 
    end 

    def url(_router, %Socket{endpoint: endpoint}) do 
    endpoint.url 
    end 

    def url(_router, %URI{} = uri) do 
    uri_to_string(uri) 
    end 

    def url(_router, endpoint) when is_atom(endpoint) do 
    endpoint.url 
    end 

È possibile ignorare questo utilizzando struct_url/0:

struct_url = update_in(Endpoint.struct_url.host, fn (_) -> "domain2" end) 
some_url(struct_url, :index) 

È inoltre possibile definire un secondo endpoint per il secondo dominio. Se i tuoi collegamenti sono interni, dovresti prendere in considerazione l'utilizzo delle funzioni _path invece delle funzioni _url. Gli helper _url vengono generalmente utilizzati quando è richiesto il dominio (come le e-mail).

+0

Grazie Gazler Puoi anche dire dove dovrei collocare questo codice di struct_url che sovrascrive in modo che sia globalmente efficace? Mi dispiace, sono molto nuovo a Phoenix. –

+1

@ PratikKhadloya Prima di tutto, hai sicuramente bisogno di usare il formato '_url' e non il formato' _path'? Se lo fai, puoi dirmi da dove lo chiami? – Gazler

+0

Uno dei miei link è un collegamento di login, che non sono sicuro di come usare _url. '<% = link" Login ", a:"/login ", classe:" nav-link "%>'. Quando clicco su questo link restituisce l'intero html della casa pagina di nuovo, dando la sensazione che non sta accadendo nulla nella pagina. Non ho ancora provato la soluzione struct_url –

3

Si è verificato un errore nella clausola if. Sarà sempre true.

iex(1)> host = "l2.com" 
"l2.com" 
iex(2)> host == "ll.com" || "domain1.com" 
"domain1.com" 

Per domini validi e non validi.

iex(3)> host = "ll.com"     
"ll.com" 
iex(4)> host == "ll.com" || "domain1.com" 
true 

prova:

iex(6)> if host == "ll.com" || "domain1.com" do 
...(6)> IO.puts "if" 
...(6)> end 
if 
:ok 

Devi cambiare la tua clausola if host == "ll.com" || host == "domain1.com" do. Ma. Non è idiota usare questo tipo di clausole. In genere è meglio usare pattern-matching.

+0

Grazie! Ho risolto la condizione if, ma questo non ha risolto il problema :( –