如何使用 sigil_p (~p) 创建包含摘要哈希的资产 URL?

问题描述 投票:0回答:1

我想改进这个工作代码,让它更加地道。我希望重构它并在可能的情况下使用

~p

我将此配置(

cache_manifest
位)添加到我的
dev
环境(默认情况下在
prod
中),因此我可以在开发时测试行为:

config :my_app, MyAppWeb.Endpoint,
  cache_static_manifest: "priv/static/cache_manifest.json",
  url: [path: "my-app"],
animal = Enum.random(["cat", "dog", "zebra"])

full_path =
  static_url(
    MyAppWeb.Endpoint,
    "/images/animals/#{animal}.jpg"
  )

结果(正确)是:

"http://localhost:4000/my-app/images/animals/cat-09d70aa13c48ad427298cfd9d7fe8440.jpg?vsn=d"

注意

my-app
是我配置的
path
,我也想让它反映出来

使用sigil版本返回错误:

~p"/images/animals/#{animal}.jpg"
** (ArgumentError) path segments after interpolation must begin with /, got: ".jpg" in "/images/animals/#{animal}.jpg"

我当前的代码按预期工作,但我想看看这是

sigil_p
错误还是有另一种方法可以使用
~p
使其工作,这对我来说是理想的方式。

总结(要求):

  • 使用
    Phoenix.VerifiedRoutes.static_url/2
    重构代码并将其更改为
    ~p
    .
  • 使摘要散列出现在生成的 URL 的末尾。
  • 包括基本路径。
elixir phoenix-framework
1个回答
0
投票

我不认为你的错误是

sigil_p
错误。文档讨论了插值到
~p
字符串中的一些限制:

https://hexdocs.pm/phoenix/Phoenix.VerifiedRoutes.html#module-tracking-warnings

当您遇到插值问题时,文档似乎建议您执行以下操作:

p_for_animal("cat"), do: ~p"/images/animals/cat.jpg"
p_for_animal("dog"), do: ~p"/images/animals/dog.jpg"
p_for_animal("zebra"), do: ~p"/images/animals/zebra.jpg"
p_for_animal(_), do: no path

但是,我无法获得

"/images/*"
形式的任何路径给我一个警告。我唯一一次收到警告是在我尝试像
"/non/existent/1"
这样的路径时。似乎
~p
没有验证到
"/images"

的路线
© www.soinside.com 2019 - 2024. All rights reserved.