# Cannot invoke remote function Access.get/2 inside guards

**URL:** <https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518>\
**Category:** Questions\
**Tags:** code-style, learning-elixir\
**Created:** [April 10, 2020, 3:12pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518 "2020-04-10T15:12:13Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![david234](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/d/838e76/32.png) [@david234](https://forum.elixirforum.com/u/david234)\
**Post date:** [April 10, 2020, 3:12pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518/1 "2020-04-10T15:12:14Z")

</div>

I have this form

```
                    <%= form_for @conn, Routes.admin_products_path(@conn, :create_product), [as: :create_product, id: "product-form", class: "mt-5 mb-5 login-input", method: :post, multipart: :true], fn f -> %>

                            <div class="form-group">
                                <%= text_input f, :name, placeholder: "Name", class: "form-control" %>
                            </div>
                            <div class="form-group">
                                <%= text_input f, :description, placeholder: "Description", class: "form-control" %>
                            </div>

                            <h4 class="card-title">Image Upload</h4>
                            <div class="form-group">
                                <%= file_input f, :image_files, name: "create_product[images][]", multiple: true, class: "form-control", placeholder: "Upload Image" %>
                            </div>

                            <h4 class="card-title">Video Upload</h4>
                            <div class="form-group">
                                <%= file_input f, :video_files, name: "create_product[videos][]", multiple: true, class: "form-control", placeholder: "Upload Image" %>
                            </div>

                        <br/><br/>
                        <input type="submit" value="Save" class="btn btn-dark mb-2" />
                    <% end %>

```

I have this three function to filter and process through Guard

```elixir
def create_product(conn, %{"create_product" => product_params}) when is_list(product_params["images"]) == true and is_list(product_params["videos"]) == true do

def create_product(conn, %{"create_product" => product_params}) when is_list(product_params["images"]) == true and is_list(product_params["videos"]) == false do

  def create_product(conn, %{"create_product" => product_params}) when is_list(product_params["images"]) == false and is_list(product_params["videos"]) == true do

```

Below is my inspect output

```elixir
%{
  "description" => "sdfdf",
  "images" => [
    [
      %Plug.Upload{
        content_type: "image/jpeg",
        filename: "deuteronomy-2223-eggstransvestite-transvestism-cross-dressing-cult-prostitutes-lost-and-found-35-638.jpg",
        path: "/tmp/plug-1586/multipart-1586529347-447222130427589-1"
      }
    ]
  ],
  "name" => "Sony"
}

```

I can see this error is due to accessing` product_params["images"]`.  
Can anyone give me insight on how to solve this? Or is there any better way to filter this. Your help is greatly appreciated

---

<div class="post-metadata">

**Author:** ![benwilson512](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/benwilson512/32/1457_2.png) [@benwilson512](https://forum.elixirforum.com/u/benwilson512)\
**Post date:** [April 10, 2020, 3:15pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518/2 "2020-04-10T15:15:42Z")

</div>

Hi @david234, you need to write it like this:

```elixir
def create_product(conn, %{"create_product" => %{"images" => images, "videos" => videos} = product_params)
  when is_list(images) and not is_list(videos) do

```

Basically, you need to pattern match out the values you want to use in the guards. Do note that the clause won’t match at all unless the product params include BOTH images and videos. If you need to handle them not being present at all, I’d consider doing this just inside the function body.

---

<div class="post-metadata">

**Author:** ![david234](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/d/838e76/32.png) [@david234](https://forum.elixirforum.com/u/david234)\
**Post date:** [April 10, 2020, 3:42pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518/3 "2020-04-10T15:42:02Z")

</div>

thanks @benwilson512 for your response. So i wrote like this

```elixir
  def create_product(conn, %{"create_product" => %{"images" => images, "videos" => videos} = product_params}) when is_list(images) and is_list(videos) do

  def create_product(conn, %{"create_product" => %{"images" => images, "videos" => videos} = product_params}) when is_list(images) do

  def create_product(conn, %{"create_product" => %{"images" => images, "videos" => videos} = product_params}) when is_list(videos) do

  def create_product(conn, %{"create_product" => product_params}) do

```

Do you think it is wise to do in this way? Or else I will write only one function inside that I will do all the filters. Which way is better?  
I want to improve my coding standard so only asking this.

---

<div class="post-metadata">

**Author:** ![benwilson512](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/benwilson512/32/1457_2.png) [@benwilson512](https://forum.elixirforum.com/u/benwilson512)\
**Post date:** [April 10, 2020, 5:04pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518/4 "2020-04-10T17:04:05Z")

</div>

Without know what you’re doing in the function body it’s hard to say. Personally I’d probably do something more like:

```elixir
def create_product(conn, %{"create_product" => product_params}) do
  images = product_params["images"] || []
  videos = product_params["videos"] || []

```

But again, it depends on what you’re doing. If each of those clauses is a wildly different flow then go ahead with the pattern you have. If you’re just using it to normalize the data or something then I think that can be accomplished more succinctly by working with the parameters more individually.

---

<div class="post-metadata">

**Author:** ![david234](https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/d/838e76/32.png) [@david234](https://forum.elixirforum.com/u/david234)\
**Post date:** [April 10, 2020, 5:11pm UTC](https://forum.elixirforum.com/t/cannot-invoke-remote-function-access-get-2-inside-guards/30518/5 "2020-04-10T17:11:07Z")

</div>

Thank you very much @benwilson512
