2
votes

Is it possible to update a nested keyword list in elixir? For example i am trying to make the following work

Keyword.put(conn.private.phoenix_endpoint.config(:url), :host, conn.host)

But somehow, the updated host is not reflected in the conn variable.

2

2 Answers

2
votes

You can use Kernel.put_in/3 which will work with a combination of maps and keyword lists.

put_in(conn, [:private, :phoenix_endpoint, :config, :url, :host], conn.host) 

Edit As @manukall has pointed out, this won't work in this particular case as conn.private.phoenix_endpoint returns a module and not a map or a keyword list.

1
votes

The problem here is that, assuming you're in a phoenix app, conn.private.phoenix_endpoint will return your endpoint module. So you are basically calling MyApp.Endpoint.config(:url). You can not change that functions return value in that way.

What you could probably do is overwrite the phoenix_endpoint key in conn.private to point it to some other module, but I don't think this is what you want to do.