認証ログイン用のミックスインを作成しようとしているので、ログインできるはずのモデルに適用できます。Ruby の has_secure_password によく似ています。
use
私の知る限り、これはモジュールを必要とするステートメントを使用して行われ、__using__
マクロを呼び出します。だから私はこのように私のミックスインを実装しました。
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
次に、「ユーザー」モデルで使用を呼び出します。
defmodule MyApp.Farm do
use MyApp.Web, :model
use MyApp.SecurePassword
schema "farms" do
field :name, :string
field :email, :string
#.....
私のコントローラーでは、メソッドを使用しようとしています。
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
しかし、コードをヒットすると、認証関数を呼び出す行で引数エラーが発生します。
私のマクロスキルはかなり弱いです。何が間違っていますか? :)