donwhit
February 19, 2022, 3:13pm
1
I have a nested map and I want to enter a password_hash value in a field.
map = %{
“city” => “Meadville”,
“credential” => %{
“email” => “don@mail”,
“password” => “qwerty”,
“password_hash” => “”
},
“firstname” => “Don”,
“lastname” => “Whitbeck”,
“phoneone” => “xxx-xxx-xxxx”,
“phonetwo” => “”,
“spousename” => “xxx”,
“state” => “xx”,
“streetaddress” => “xxxx”,
“username” => “donwhit”,
“zipcode” => “xxxxxx”
}
In iex everything works
iex> password = get_in(map, [“credential”, “password”])
iex > hash = Pbkdf2.hash_pwd_salt(password)
“$pbkdf2-sha512$160000$POD__etcetera”
Here is the puzzle.
when I compile this code and try to run this, I get errors.
In the browser I have
ArgumentError at GET /parents/new
errors were found at the given arguments:
:erlang.iolist_to_binary/1
1.nil
The offending code line is - hash = Pbkdf2.hash_pwd_salt(password)
in the following function (partly shown here)
def changeset(parent, attrs) do # Create a parent
password = get_in(attrs, [“credential”, “password”])
hash = Pbkdf2.hash_pwd_salt(password) # offending line of code
I have tried a dozen ways to analyze this error with no results.
hauleth
February 19, 2022, 3:37pm
2
It seems that you send wrong data to the endpoint. There is no such field that you want and get_in/2
returns nil
atom, which is not correct IO list.
2 Likes
donwhit
February 19, 2022, 4:13pm
3
Thank you for your quick response, I input the data into a template using form_for.
in my function. I inspected the data in this function
def changeset(parent, attrs) do # Create a parent
IO.inspect(parent) # which produces output
%Coop.Schema.Parent{
__meta__: #Ecto.Schema.Metadata<:built, "parents">,
city: nil,
credential: #Ecto.Association.NotLoaded<association :credential is not loaded>,
current: "Y",
firstname: nil,
id: nil,
inserted_at: nil,
lastname: nil,
phoneone: nil,
phonetwo: nil,
spousename: nil,
state: nil,
streetaddress: nil,
title: nil,
updated_at: nil,
username: nil,
zipcode: nil
}
IO.inspect(attrs) # which produces output - note I only filled in the minimum required fields
%{
"city" => "",
"credential" => %{
"email" => "whit@mail",
"password" => "qwerty",
"password_hash" => ""
},
"firstname" => "Don",
"lastname" => "Whitbeck",
"phoneone" => "",
"phonetwo" => "",
"spousename" => "",
"state" => "",
"streetaddress" => "",
"username" => "donwhit",
"zipcode" => ""
}
password = get_in(attrs, ["credential", "password"]) # next line of code
IO.inspect(password) # which produces
"qwerty"
Hello,
You can wrap your code with ``` to make it more readable.
I have edited your last post, to show You the difference
al2o3cr
February 19, 2022, 5:26pm
5
A typical “new” action initializes a changeset with attributes of %{}
; that would cause exactly this error message.