trenpixster/addict

extra_validation function reference

AvaelKross opened this issue · 8 comments

I'm very new to elixir, phoenix and addict, so maybe it's a dumb question.
I created new app, added 'addict', configured it all properly - everything works well locally.
Now I want to deploy my app, so I'm running mix release. First time I did it, I faced this error:

Cannot add file sys.config to tar file - [{error,{83,erl_parse,["syntax error before: ",["Fun"]]}}]
===> Provider (tar) failed with: {error,
                                         {rlx_prv_archive,
                                          {tar_unknown_generation_error,
                                           "blog_phoenix","0.0.1"}}}

I checked sys.config file and found that it fails on this line of config.exs:

extra_validation: fn ({valid, errors}, user_params) -> {valid, errors} end,

It's being converted to this content in sys.config:
{extra_validation,#Fun<erl_eval.12.50752066>}

Then I found configs.md here and tried to replace this: extra_validation: fn ({valid, errors}, user_params) -> {valid, errors} end with this: extra_validation: BlogPhoenix.User.validation

Of course I added this to my User model:

def validate({valid, errors}, user_params), do: {valid, errors}

Now 'mix release' fails with undefined function BlogPhoenix.User.validate/0 (module BlogPhoenix.User is not available).

Do you have any idea how to fix it and why initial code didn't worked at all?

Hey @AvaelKross! No idea why it didn't work, will have to try to make a release and get back to you, thanks for reporting!

Regarding your new function, thanks for the heads up, that example is wrong. The way to capture a function, instead of invoking it, is via &your_func/n, where n is the number of arguments to the function. In your case, that would be

# config.exs
(...)
    extra_validation: &BlogPhoenix.User.validate/2
(...)

Check the official docs here for more information into this :)

@trenpixster It still does not work during mix release.

As a temporary solution I made a fork where I call configs.user_schema.addict_validate function explicitly in register.ex. It's like a workaround, but may be useful for someone else

0b01 commented

Any update on this?

0b01 commented

I'm a newbie but according to this guy the config has to be an MFA tuple(don't know what that is)

Relevant links:
bitwalker/distillery#185 (comment)
https://github.com/mrluc/deferred_config/blob/master/README.md

@RickyHan with latest versions of elixir/phoenix/this module, the following code works to me:

extra_validation: {AppName.ModelName, :addict_validate_method_name}

0b01 commented

I dug into the source code and found the Addict.Helper.exec({mod, func}, args) function. So I logged the module name and function name. The module name has Elixir appended in the front: Elixir.ModuleName.ModelName

Is it the expected scoping behavior?

@AvaelKross's solution solved this issue for me.