2017-05-12 6 views
1

私は現在、アプリにueberauthとguardianの認証フレームワークを統合しようとしています。私は例を見ています、特にgithubのこの1つ:https://github.com/hassox/phoenix_guardianアンダースコア接頭辞パラメータ名を持つエリクシール関数 - これはどのように機能しますか?

レンダリングされたWebページが4つのパラメータで認証コントローラを呼び出しますが、ページで2つのパラメータを持つ関数が呼び出される部分があります。

auth_controller.exでは、https://github.com/hassox/phoenix_guardian/blob/ueberauth-guardian/web/controllers/auth_controller.exです。 ログイン機能は、それらの2パラメータに接頭辞として下線を有する4つのパラメータを有する:

def login(conn, _params, current_user, _claims) do 
    render conn, "login.html", current_user: current_user, current_auths: auths(current_user) 
end 

ログイン機能の呼び出し元、login_bar.html.eex、https://github.com/hassox/phoenix_guardian/blob/ueberauth-guardian/web/templates/layout/login_bar.html.eex

<%= if @current_user do %> 
    <li> 
    <%= link "Logout", to: auth_path(@conn, :logout), method: :delete, class: "btn btn-danger" %> 
    </li> 
    <%= if @conn.request_path != auth_path(@conn, :login, "identity") do %> 
    <li> 
     <%= link "Connect", to: auth_path(@conn, :login, "identity"), class: "btn btn-default"%> 
    </li> 
    <% end %> 
<% else %> 
    <li> 
    <%= if @conn.request_path != auth_path(@conn, :login, "identity") do %> 
     <%= link "Login", to: auth_path(@conn, :login, "identity"), class: "btn btn-primary"%> 
    <% end %> 
    </li> 
<% end %> 
メソッドの一部をエミュレートしようとしますが

、私は次のエラーを見ている:

UndefinedFunctionError at GET /auth/identity 
function MyApp.AuthenticationController.login/2 is undefined or private. Did you mean one of: 
     * login/4 

カルシウム誰かがこの仕組みを説明していますか?ありがとう!

+0

忘れてしまいましたが、私はアンダースコアプレフィックスがどのようにパラメータ(無視できる)として機能するかを理解しています。これは、呼び出し元が関数のパラメータを無視できることを意味しますか? –

答えて

2

関数があり、1つまたは複数のパラメータにアンダースコアを使用すると、そのパラメータを使用していないことをコンパイラ(および他のプログラマ)に伝えるだけです。パラメータの先頭にアンダースコアを付けずに使用しなかった場合は、コンパイラから警告が表示されます。

iex(1)> defmodule Hello do 
...(1)> def world(x) do 
...(1)> IO.puts "Hello World!" 
...(1)> end 
...(1)> end 
warning: variable "x" is unused 
    iex:2 

{:module, Hello, 
<<70, 79, 82, 49, 0, 0, 4, 248, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 146, 
    131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
    95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:world, 1}} 

下線のパラメータは、我々が_xとしてxパラメータを使用して上記のモジュールと機能を定義したと仮定すると、まだ関数に渡すことが必須とされている、あなたは

iex(2)> Hello.world 
** (UndefinedFunctionError) function Hello.world/0 is undefined or private. Did you mean one of: 

     * world/1 

    Hello.world() 

はまた、あなたのauth_path機能ことに注意して見るでしょう実際には認証コントローラを直接呼び出さないでください。その機能はルータによって実際に作成されています。 scope/2resources/4のようなルータで使用する関数はマクロです。コンパイル時には、MyApp.Web.Router.Helpersモジュールにいくつかのヘルパー関数を生成します。この関数は、実際にページ間を移動する方法をアプリケーションに指示します。

+0

ありがとうございます。したがって、基本的に参照コードは全く機能しませんでした。なぜなら、4つのパラメータのうち2つにアンダースコアが付いていたため、コンパイラは4つのパラメータすべてが関数を呼び出す必要があるためです –

関連する問題