我想改进这个工作代码,让它更加地道。我希望重构它并在可能的情况下使用
~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
.我不认为你的错误是
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"
的路线