david234

david234

Cannot invoke remote function Access.get/2 inside guards

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

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

%{
  "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

Marked As Solved

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

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

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.

Also Liked

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

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

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.

Last Post!

david234

david234

Thank you very much @benwilson512

Where Next?

Popular in Questions Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49134 226
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42576 114
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement