我希望能够为我的应用程序的每个路径/页面上显示的destak弹出窗口传递数据。数据在数据库上,因此我使用查询来获取它并将其在控制器中传递到特定页面:
def admin(conn, _params, locale) do
destaks = Data.listAll(query)
render(conn, "admin.html", destaks: destaks)
end
让所有页面都可以使用它的最佳方法是什么,同时确保在我更新数据库中的数据时它会自动反映在所有页面上?
答案 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 %>