2016-04-26 15 views
1

私はDRY Elixirを書こうとしていますが、Dave Thomasの本はまだ投稿中です!変数を使用する構造

以下はCardのために自動生成されたPhoenixコントローラの一部です。実際には、Cardとまったく同じように動作するさまざまな製品がありますので、私は一般化したいと思います。私の努力の1つは下にありますが、エラーは** {} **でコンパイルされません。

私は言語に慣れていないので、私は基本的な間違いを犯していると確信しています(しかし、関数型プログラミングではありません)。あなたはこれで私を助けることができる場合

alias Api.Card 

    map = %{"cards" => Card, "books" => Book} 

    def create(conn, %{"product" => product}) do 

    # changeset = Card.changeset(%Card{}, card_params) 
    changeset = map[product].changeset(%map[product]**{}**, card_params) 

    case Repo.insert(changeset) do 
     {:ok, product} -> 
     conn 
     |> put_status(:created) 
     |> put_resp_header("location", card_path(conn, :show, card)) 
     # |> render("show.json", card: card) 
     |> render("new_key.json", id: product.id) 

は、私も同様に変数に card_pathを有効にする必要があることに注意してください、私はそれが estimate_path productのラインに沿ったものになると思います。

は私もこれを試してみましたが、成功しなかったとしても

(Struct, path) = 
    case product do 
     "cards" -> (Card, card_path) 
     _ -> (Card, card_path) 
    end 

答えて

3

あなたが(デフォルト値で)空の構造体を作成したい場合は、自動モジュール上__struct__/0機能を生成呼び出すことができます。

  1. ストアpath = &card_path/3を使用して関数への参照:

    変更

    changeset = map[product].changeset(%map[product]**{}**, card_params) 
    

    changeset = map[product].changeset(map[product].__struct__, card_params) 
    

    に変数にcard_path機能を保存するには、少なくとも2つのオプションがありますその後、それをpath.(conn, :show, card)と呼びます。

  2. path = :card_pathのように原子として保存し、apply/3を使用してapply(YourApp.Router.Helpers, path, [conn, :show, card])とします。

+0

ありがとうございます。最初のビットがうまくいきました。私はあなたも後者について正しいと確信しています。しかし、そのために、私はPhoenixを使用しており、 'resources/estimates /:product"、EstimateControllerを持っています:[:new、:edit] 'のように' estimate_path'で遊ぶ方法があるのか​​疑問に思っていましたか? –

+0

これは熟語ですか?今のところ私は 'map'を' create'の中に使うことができますが、私は他の関数にも必要です。 –

+1

マップを格納するためにモジュール属性を使うべきです。モジュール内で '@map%{...}'を使って定義し、関数内で '@ map 'を使ってアクセスしてください。 – Dogbert

関連する問題