在所有路由中获得相同查询结果的最佳实践

时间:2017-11-28 17:32:35

标签: phoenix-framework

我希望能够为我的应用程序的每个路径/页面上显示的destak弹出窗口传递数据。数据在数据库上,因此我使用查询来获取它并将其在控制器中传递到特定页面:

def admin(conn, _params, locale) do
    destaks = Data.listAll(query)
    render(conn, "admin.html", destaks: destaks)
  end

让所有页面都可以使用它的最佳方法是什么,同时确保在我更新数据库中的数据时它会自动反映在所有页面上?

1 个答案:

答案 0 :(得分:1)

您可以使用自定义Plug功能。这是一个例子:

1)在某处定义你的插件功能(对于我的例子,我把它放到router.ex)。第一个参数是我们将数据添加到的连接,在这种情况下我们不需要第二个参数:

def database_thing(conn, _) do
  # This is where you get things from the database
  data_from_a_query = ["these", "will", "be", "from", "your", "query"]
  Plug.Conn.assign(conn, :values_from_database, data_from_a_query)
end

2)将插件功能添加到router.ex中的管道,您可以将其添加到现有管道或创建新管道:

# Example of adding to an existing pipeline
pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_flash
  plug :protect_from_forgery
  plug :put_secure_browser_headers
  plug :database_thing # add it
end

# Example of creating a new pipeline
pipeline :everytime do
  plug :database_thing
end

3)确保您的渠道在您的范围内。如果将其添加到现有管道中,则不必执行太多操作。如果您创建了新管道,则必须将其添加到router.ex中的范围:

scope "/", MyPhoenixApp do
  pipe_through [:browser, :everytime]

  resources "/users", UserController
end

4)访问控制器中的值。如果您查看第一步,您可以看到我们使用密钥:values_from_database分配数据。要访问该数据,您可以在控制器功能中执行以下操作:

def index(conn, _params) do
  IO.inspect(conn.assigns.values_from_database)
  # ...
end

5)访问模板中的值conn通过控制器函数传递给模板,因此根据您的尝试,您可能根本不需要访问控制器函数中的值,只需直接在模板中使用它:

<%= @conn.assigns.values_from_database %>