JSON-凤凰直播上的LD标签
JSON-LD tag on Phoenix Liveview
我需要将一些 JSON-LD 内容放在脚本标签中。今天,我把内容是这样的:
page_live.ex
defmodule ProjectWeb.PageLive do
use ProjectWeb, :live_view
@data_structure %{
"@context": "http://www.schema.org",
"@type": "WebSite",
name: "Project",
url: "https://project.com/"
}
@impl true
def mount(_params, _session, socket) do
socket = assign(socket, data_structure: @data_structure)
{:ok, socket}
end
end
root.html.leex
<!DOCTYPE html>
<html lang="pt-BR">
<head>
...
<%= if @data_structure do %>
<script type='application/ld+json'>
<%= Poison.encode!(@data_structure) %>
</script>
<% end %>
...
</head>
<body>
<%= @inner_content %>
</body>
<html>
Poison 库总是转换为字符串。我需要 JSON.
如何将 JSON 内容放入脚本标签中?
诀窍是使用 raw
函数将编码字符串标记为“安全”以用作 JSON。
假设您的控制器通过以下方式将地图值传递给您的视图:
def index(conn, _params) do
render(conn, "index.html", foo: %{x: "xray", y: "yep"})
end
然后你可以这样做(使用Poison
应该是一样的):
<script>
var x = <%= @foo |> Jason.encode!() |> raw() %>;
console.log(x);
</script>
我需要将一些 JSON-LD 内容放在脚本标签中。今天,我把内容是这样的:
page_live.ex
defmodule ProjectWeb.PageLive do
use ProjectWeb, :live_view
@data_structure %{
"@context": "http://www.schema.org",
"@type": "WebSite",
name: "Project",
url: "https://project.com/"
}
@impl true
def mount(_params, _session, socket) do
socket = assign(socket, data_structure: @data_structure)
{:ok, socket}
end
end
root.html.leex
<!DOCTYPE html>
<html lang="pt-BR">
<head>
...
<%= if @data_structure do %>
<script type='application/ld+json'>
<%= Poison.encode!(@data_structure) %>
</script>
<% end %>
...
</head>
<body>
<%= @inner_content %>
</body>
<html>
Poison 库总是转换为字符串。我需要 JSON.
如何将 JSON 内容放入脚本标签中?
诀窍是使用 raw
函数将编码字符串标记为“安全”以用作 JSON。
假设您的控制器通过以下方式将地图值传递给您的视图:
def index(conn, _params) do
render(conn, "index.html", foo: %{x: "xray", y: "yep"})
end
然后你可以这样做(使用Poison
应该是一样的):
<script>
var x = <%= @foo |> Jason.encode!() |> raw() %>;
console.log(x);
</script>