2016-01-26 4 views
5

データベースからデータを取得する代わりに、手作業で作成されたJSONファイルをデータとして使用したいと考えています。PhoenixフレームワークでJSONファイルをレンダリングするには?

[ 
    { "id": 1, "name": "Alice", "email": "[email protected]" }, 
    { "id": 2, "name": "Bob", "email": "[email protected]" }, 
    { "id": 3, "name": "Charles", "email": "[email protected]"} 
] 

、それはMOCK_DATA.jsonと呼ばれるファイルに記述されています:私のデータはこれであると仮定します。 localhost:port/api/v1/usersのURLにアクセスしたときにこのファイルをレンダリングするにはどうすればよいですか?どのようにを表示するには、localhost:port/api/v1/users/1 URLですか?

+1

すぐに開始するためにレスポンスを模擬し、後で「本当の」実装に置き換えるだけでいいですか?これは生産準備ができている必要はありませんね。 –

+0

@PatrickOscityはい、正確です。 –

答えて

9

は、基本的な作業例です...

ステップ1:

フェニックスアプリを作成します例えば、ExampleJsonためexjsonか、どんな名前あなたのような

mix phoenix.new exjson --no-ecto --no-brunch --no-html 
ステップ2:ルータ を設定します

ウェブ/ router.exファイル

scope "/api/v1", Exjson do 
    pipe_through :api 
    resources "/users", UserController 
    end 
ステップ3に、この範囲を追加します:ACどこかモックデータを入れてアプリ
priv/data/MOCK_DATA.json 
ステップ4にcessible:アクション(機能)の数を持つものとしてユーザーコントローラーのがUserController

だと思うのセットアップconn structがどの パラメータと一緒にあなたのフェニックスのエンドポイントからに供給され

defmodule Exjson.UserController do 
    use Exjson.Web, :controller 

    # GET http://localhost:4000/api/v1/users/ 
    def index(conn, _params) do 
    users = File.read!(file) |> Poison.decode!() 
    render conn, users: users 
    end 

    # GET http://localhost:4000/api/v1/users/1 
    def show(conn, params) do 
    users = File.read!(file) |> Poison.decode!() 
    render conn, user: users |> Enum.find(&(&1["id"] === String.to_integer(params["id"]))) 
    end 

    defp file() do 
    Path.join(:code.priv_dir(:exjson), "data/MOCK_DATA.json") 
    end 

end 
ステップ5:UsersView

設定します。また、ユーザーの考えることができるが、適切な方法で、コントローラから受信したデータをレンダリングする機能を有していると見ます。この場合、jsonデータを使用していますので、phoenixには、そのための機能が組み込まれています。

defmodule Exjson.UserView do 
    use Exjson.Web, :view 

    def render("index.json", %{users: users}) do 
    render_many(users, __MODULE__, "user.json") 
    end 

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

    def render("user.json", %{user: user}) do 
    %{ 
     id: user["id"], 
     name: user["name"], 
     email: user["email"] 
    } 
    end 

end 
+0

あなたのapiでjsonを送信するだけで、ブラウザ上のデータをレンダリングするという用語は、今日、開発者はいわゆる「単一ページアプリケーション」フレームワークを使用してユーザーインターフェイス(ブラウザコンポーネント)を作成しています。例えば[Aurelia](http://aurelia.io/)、[Angular2](https://angular.io/)ですが、それはちょうどいくつかの名前を挙げるに過ぎません。多くはあります.... –

+0

' code.priv_dir(:exjson) '' Path.join'関数のパラメータ?私はフェニックスのソースコードを検索しましたが、私の検索は空になりました。 –

+1

これは[erlangライブラリ](http://erlang.org/doc/man/code.html#priv_dir-1)の関数です。あなたのprivフォルダを取得します。このフォルダ内のファイルはアプリケーションで使用できます。 –

1

ファイルが静的な場合(サービスの実行中に変更されない場合)、アプリケーションがコントローラでコンパイルされたときにファイルを読み取ることができます。モジュールのパラメータ(モジュール内で、関数の外で定義するもの)を調べます。このように私は一度解析されます。

このファイルが動的な場合は、APIが呼び出され、解析されるたびに読み込む必要があります。ディスクIOからファイルを読み込むと遅くなるので、実際には勧められません。

いずれの場合でも、マップに解析されたファイルの結果はビューに渡され、レンダリングされ、データベースとの違いはありません。

編集:もう1つの方法は、JSON(可能な場合)を再フォーマットし、idをキーとし、残りのデータを値として持つことです。 idによるこのようなルックアップは、データベースの主キー索引のように非常に高速になります。ここで

+0

私はフェニックスとエリクシールの両方の初心者ですから、私はあなたの答えを理解していませんでした。いくつかのコード例を教えてください。また、パフォーマンスのヒントをお寄せいただきありがとうございますが、現時点ではブラウザ上でデータをレンダリングする方法がわからないので、その領域の具体的な手順をお読みいただければ幸いです。 –

8

あなたに始めるためにいくつかの実際のコードを与えること、これは私が考えることができる最も簡単なものです:ちょうどあなたのプロジェクト内のpriv/mock_data/users.jsonであなたの偽のデータを保存し

defmodule MyApp.UserController do 
    @mock_data (
    Application.app_dir(:my_app, "priv/mock_data/users.json") 
    |> File.read! 
    |> Poison.decode! 
) 

    def index(conn, _params) do 
    conn 
    |> put_status(:ok) 
    |> json(@mock_data) 
    end 
end 

。そこにタイプミスがあるかもしれませんが、あなたは基本的な考え方を得ます...

2

/usersエンドポイントのJSONを返すだけなので、この場合はJSONの不要なデコード/エンコードを行うPoison.decode/1コールは必要ありません。パトリックコード適応ので

は、:

defmodule MyApp.UserController do 
    @mock_data_string (
    Application.app_dir(:my_app, "priv/mock_data/users.json") 
    |> File.read! 
) 

    def index(conn, _params) do 
    conn 
    |> put_resp_content_type("application/json") 
    |> send_resp(200, @mock_data_string) 
    end 
end 

しかし、/users/1エンドポイントのために、それは@ stephen_mの答えが示すように、Poison.decode/1を使用して値を抽出するのが最善です。

+0

それは素晴らしいです!私は似たようなものが必要です(JSONデータをPhoenix経由で別のサーバーから転送するだけです)。私はそれを試してみましょう! – fenton