Elixir 清理长生不老药/凤凰地图更换代码

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

你有什么建议可以让这个更干净吗

视频参数来自表单提交,因此地图为%{“url”=>“…”,“title”=>“里约热内卢的卡内瓦尔”,…}

以下是我的
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文件中,现在正在导入它。defp
youtube_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