Elixir 清理长生不老药/凤凰地图更换代码
你有什么建议可以让这个更干净吗 视频参数来自表单提交,因此地图为%{“url”=>“…”,“title”=>“里约热内卢的卡内瓦尔”,…} 以下是我的Elixir 清理长生不老药/凤凰地图更换代码,elixir,phoenix-framework,Elixir,Phoenix Framework,你有什么建议可以让这个更干净吗 视频参数来自表单提交,因此地图为%{“url”=>“…”,“title”=>“里约热内卢的卡内瓦尔”,…} 以下是我的create方法(如果有任何用处): def create(conn, %{"video" => video_params}, user) do changeset = user |> build_assoc(:videos) |> Video.changeset(video_para
create
方法(如果有任何用处):
def create(conn, %{"video" => video_params}, user) do
changeset =
user
|> build_assoc(:videos)
|> Video.changeset(video_params |> make_url_ready_for_embedding)
case Repo.insert(changeset) do
{:ok, _video} ->
conn
|> put_flash(:info, "Video created successfully.")
|> redirect(to: video_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
逻辑是有道理的,但行是相当长的 我可能会选择这样的方式:
defp make_url_ready_for_embedding(%{"url" => url} = video_params) do
url = cond do
String.contains?(url, "/watch?v=") ->
String.replace(url, "/watch?v=", "/embed/")
String.contains?(url "https://vimeo.com") ->
Regex.replace(~r/([^1-9]+)/, url, "https://player.vimeo.com/video/")
true ->
url
end
%{video_params | "url" => url)
end
这是更好的,但意图仍然不是很清楚,一目了然。我可能会考虑使用函数来帮助这个:
defp make_url_ready_for_embedding(%{"url" => url} = video_params) do
type = cond do
youtube_video?(url) -> :youtube
vimeo_video?(url) -> :vimeo
true -> :unknown
end
%{video_params | "url" => transform_url(url, type)}
end
defp youtube_video?(url) do
String.contains?(url, "/watch?v=")
end
defp vimeo_video?(url) do
String.contains?(url, "https://vimeo.com")
end
defp transform_url(url, :unknown) do: url
defp transform_url(url, :youtube) do
String.replace(url, "/watch?v=", "/embed/")
end
defp transform_url(url, :vimeo) do
Regex.replace(~r/([^1-9]+)/, url, "https://player.vimeo.com/video/")
end
这样做的好处是,你可以测试你的
transform\u url
函数(公开和@doc false),以确保对每种类型的url都进行了正确的转换。我认为这很好。我已将函数移到一个单独的video_transformers.ex文件中,现在正在导入它。defpyoutube_video?/1
函数中有一个输入错误:String.contains?(url)https://vimeo.com“
应该有一个逗号,使之成为:字符串。包含?(url,”https://vimeo.com“”
defp make_url_ready_for_embedding(%{"url" => url} = video_params) do
type = cond do
youtube_video?(url) -> :youtube
vimeo_video?(url) -> :vimeo
true -> :unknown
end
%{video_params | "url" => transform_url(url, type)}
end
defp youtube_video?(url) do
String.contains?(url, "/watch?v=")
end
defp vimeo_video?(url) do
String.contains?(url, "https://vimeo.com")
end
defp transform_url(url, :unknown) do: url
defp transform_url(url, :youtube) do
String.replace(url, "/watch?v=", "/embed/")
end
defp transform_url(url, :vimeo) do
Regex.replace(~r/([^1-9]+)/, url, "https://player.vimeo.com/video/")
end