使用Phoenix将已解码的JSON传递给视图

时间:2017-10-11 00:16:30

标签: json elixir phoenix-framework

我正在使用HTTPoisonPoison解码对视图的json响应。我成功解码了响应主体,但我很难将其纳入视图。我收到此错误:cannot encode maps inside lists when the map has 0 or more than 1 elements

以下是我在控制器中所做的事情:

url = "https://api.sportradar.us/nba/trial/v4/en/games/2016/11/06/schedule.json?api_key={api_key}"

case HTTPoison.get(url) do
  {:ok, %{status_code: 200, body: body}} ->
    decoded_json = Poison.decode!(body)
    redirect(conn, to: schedule_path(conn, :index, decoded_json))
  {:ok, %{status_code: 404}} ->
end

我可以将响应传递给重定向吗?我觉得这是错误的做法吗?

1 个答案:

答案 0 :(得分:2)

您的控制器可能应该呈现您想要的数据/视图,而不是使用您的数据重定向到另一个控制器。

重定向通常用于执行操作之后,例如成功的POST请求和对请求中的数据执行某些操作,您将被重定向到另一个页面。它们通常不用于将数据从一种控制器方法发送到另一种控制器方法。

我不知道你想要完成什么,所以我的榜样只能和我的假设一样好。但是,这是一种方法,可能比你想做的更有意义。我希望它至少可以帮助你朝着更好的方向前进:

defmodule MyAppWeb.MyController do
  use MyAppWeb, :controller

  alias MyApp.MyScheduleThing

  action_fallback MyAppWeb.FallbackController

  def index(conn, %{"date" => date} = params) do
    with {:ok, schedule} <- MyScheduleThing.get_schedule(date) do
      render(conn, "schedule.html", schedule: schedule)
    end
  end
end

你的模块用于做任何事情

defmodule MyApp.MyScheduleThing do
  @moduledoc """
  A module in another file to do your HTTP fetching.
  """

  @doc "Do your thing"
  def get_schedule(date) do
    url = url_from_date(date)

    case HTTPoison.get(url) do
    {:ok, %{status_code: 200, body: body}} ->
      {:ok, Poison.decode!(body)}
    {:ok, %{status_code: 404}} ->
      {:error, :not_found}
    {:error, _err} ->
      {:error, :internal_server_error}
    end
  end

  defp url_from_date(date) do
    "https://api.sportradar.us/nba/trial/v4/en/games/#{date}/schedule"
  end
end

:internal_server_error返回可能不是您想要的,因此请将其视为我在不知道您的应用或意图的情况下放置的占位符。

{:error, :not_found}语句不匹配时,with实际上会导致它命中回退控制器。 The default one matches on that。您可以在自己的后备控制器中添加更多方法以满足您的需求。

这些都不是你真正想要的(正如我所说,我不知道你在做什么),但至少应该帮助你更好地控制你。