2016-08-25 4 views
1

:idキーにアクセスしようとしたため、以下のエラーが表示されていました。ここで驚きはありません。しかし、私の実際の質問は、ユーザーが:sessionキーの中に置かれている理由です。このプラグは特定ですか?私は以下のようにユーザをキー:sessionに設定することを覚えていません。プラグ接続またはセッションのKeyError

エラー:エラーの原因となった

** (KeyError) key :id not found in: 
%{ 
    session: %ExampleApp.User{ 
    __meta__: #Ecto.Schema.Metadata<:loaded, "users">, 
    email: "[email protected]", 
    first_name: "keith", 
    id: 356, 
    inserted_at: #Ecto.DateTime<2016-08-25 00:56:51>, 
    last_name: "a.", 
    updated_at: #Ecto.DateTime<2016-08-25 00:56:51>, 
    username: "keith" 
    }, 
    view_module: ExampleApp.SessionView, 
    view_template: "show.json" 
} 

ビュー:

defmodule ExampleApp.SessionView do 
use ExampleApp.Web, :view 

def render("show.json", %{jwt: jwt, user: user, exp: exp}) do 
    %{ 
    jwt: jwt, 
    exp: exp, 
    user: render_one(user, __MODULE__, "show.json") 
    } 
end 

def render("show.json", user) do 
    %{ 
    id: user.id, #<------------------------------------------ HERE 
    username: user.username, 
    last_name: user.last_name, 
    first_name: user.first_name 
    } 
end 

私は、ユーザーの情報にアクセスするには、次の操作を行う必要がありました:それは場合に役立ちます

... 

def render("show.json", user) do 
    %{ 
    id: user.session.id, #<------------------------------------------ HERE 
    username: user.session.username, 
    last_name: user.session.last_name, 
    first_name: user.session.first_name 
    } 
end 

はここで、コントローラの:

defmodule ExampleApp.RegistrationController do 
use ExampleApp.Web, :controller 

alias ExampleApp.{Repo, User, SessionView} 

def create(conn, %{"user" => user_params}) do 
    changeset = User.new_changeset(%User{}, user_params) 
    case Repo.insert(changeset) do 
    {:ok, user} -> 
     {:ok, jwt, claims} = user |> Guardian.encode_and_sign(:token) 
     exp = Map.get(claims, "exp") 

     conn 
     |> put_status(:created) 
     |> render(SessionView, "show.json", %{jwt: jwt, user: user, exp: exp}) 

    {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render("error.json", changeset: changeset) 
    end 
    end 
end 

私はここで間違っていますか?ご協力いただきありがとうございます。

答えて

2

However, my actual question is why is the user placed inside the :session key?

render_oneは、渡されたビューの名前を使用してキー名を推測しようとしているからです。この場合、SessionViewを渡したので、モデルに使用するキーは:sessionと推測されます。あなたが代わりにそれが:userになりたい場合は、as: :userを渡すことができます:

def render("show.json", %{jwt: jwt, user: user, exp: exp}) do 
    %{ 
    jwt: jwt, 
    exp: exp, 
    user: render_one(user, __MODULE__, "show.json", as: :user) 
    } 
end 

あなたはdocumentation for Phoenix.View.render_one/4でこれについての詳細を読むことができます。

...

render_one user, UserView, "show.html" 

...

The underlying user is passed to the view and template as :user , which is inflected from the view name. The name of the key in assigns can be customized with the :as option:

render_one user, UserView, "show.html", as: :data 

...

+0

ありがとうございました@Dogbert速い返信です!私は完全にドキュメントのそのセクションをスキミングしました。愚かな私。 –

関連する問題