如何用Phoenix的sigil_p(~p)生成带摘要哈希的资源URL?
解决Phoenix中sigil_p(~p)生成静态资源URL报错的问题
错误原因
sigil_p(~p)对路径插值有严格规则:插值内容必须是完整的路径段,不允许在插值变量后直接拼接文件后缀(比如.jpg)。你写的~p"/images/animals/#{animal}.jpg"会被解析为插值#{animal}后紧跟.jpg,而.jpg不符合路径段的起始要求(路径段需以/开头或为完整文件名),因此抛出ArgumentError。
解决方案
以下两种写法均可替代原有的static_url调用,生成包含base path和摘要哈希的完整URL:
方法1:提前拼接完整文件名
animal = Enum.random(["cat", "dog", "zebra"]) image_filename = "#{animal}.jpg" full_path = MyAppWeb.Endpoint.static_url(~p"/images/animals/#{image_filename}")
方法2:在插值内部完成文件名拼接
animal = Enum.random(["cat", "dog", "zebra"]) full_path = MyAppWeb.Endpoint.static_url(~p"/images/animals/#{animal <> ".jpg"}")
补充:仅生成资源路径(不含域名)
如果不需要完整URL,只需要带哈希的资源路径,可使用Phoenix.VerifiedRoutes.static_path/2:
animal = Enum.random(["cat", "dog", "zebra"]) image_path = static_path(~p"/images/animals/#{animal <> ".jpg"}")
内容的提问来源于stack exchange,提问作者user4757175
相关产品推荐
相关产品推荐

