gpt4 book ai didi

elixir - 如何进行 Elixir mixins

转载 作者:行者123 更新时间:2023-12-02 08:25:23 24 4
gpt4 key购买 nike

我正在尝试创建一个用于身份验证登录的混合,因此它可以应用于我应该能够登录的模型。很像 Ruby 中的 has_secure_password。

据我所知,这是使用 use 语句完成的,该语句本质上需要模块,并调用 __using__ 宏。所以我像这样实现了我的 mixin。

defmodule MyApp.SecurePassword do
defmacro __using__(_options) do
quote do
import MyApp.SecurePassword
end
end

defmacro authenticate(password) do
# Lets return true, for testing purposes.
true
end
end

然后我在我的“用户”模型中调用 use。

defmodule MyApp.Farm do
use MyApp.Web, :model
use MyApp.SecurePassword

schema "farms" do
field :name, :string
field :email, :string
#.....

在我的 Controller 中,我尝试使用该方法。

 def create(conn, %{"session" => session_params}) do
user = Repo.get_by(Farm, email: session_params["email"])

if user && user.authenticate(session_params["password"]) do
conn = put_flash(conn, :success, "You were successfully logged in")
else
conn = put_flash(conn, :error, "Credentials didn't match")
end

redirect(conn, to: session_path(conn, :new))
end

但是当我点击代码时,我只是在调用验证函数的行上收到参数错误。

我的宏观能力很弱,我做错了什么? :)

最佳答案

我认为您想要的是调用传入用户和密码的authenticate函数:

def authenticate(user, password) do
# auth logic
end

然后:

import MyApp.SecurePassword
# ...
if user && authenticate(user, session_params["password"]) do
# ...

目前似乎没有任何理由使用宏或use,一个简单的import就可以了 - 你只需要在生成一些代码时使用它们编译时,在这种情况下,您想要的一切似乎都会在运行时发生。

关于elixir - 如何进行 Elixir mixins,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com