2016-05-21 5 views
1

このクリーナーをどのように作ることができますか?エリクサー/フェニックスのマップ交換コードをクリーンアップ

ビデオparamsはフォーム提出のものであるため、%{"url" => "https://youtube.com/ ......"、 "title" => "Carneval in Rio de Janeiro"

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 

答えて

2

ロジックメイク感覚は、しかし、行が非常に長いです:それは任意の使用であれば

defp make_url_ready_for_embedding(video_params) do 
    cond do 
    String.contains? video_params["url"], "/watch?v=" -> 
     video_params |> Map.put("url", String.replace(video_params["url"], "/watch?v=", "/embed/")) 
    String.contains? video_params["url"], "https://vimeo.com" -> 
     video_params |> Map.put("url", Regex.replace(~r/([^1-9]+)/, video_params["url"], "https://player.vimeo.com/video/")) 
    true -> 
     video_params 
    end 
end 

は、ここに私のcreate方法です。私はおそらくのようなもののために行くだろう

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_url機能をテストすることができます利点を持っているURLが種類ごとに正しく変換されることを保証するために、(それが公共および@doc偽作ります)。

+0

ありがとうございます。今それを見て.... – skovmand

+0

私はそれがいいと思う。私は別のvideo_transformers.exファイルに関数を移動して今すぐインポートしています – skovmand

+0

defp 'youtube_video?/ 1'関数にタイプミスがあります: ' String.contains?(url "https://vimeo.com" ) 'はコンマをつけて、' String.contains?(url、 "https://vimeo.com") ' –