4

認証ログイン用のミックスインを作成しようとしているので、ログインできるはずのモデルに適用できます。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

しかし、コードをヒットすると、認証関数を呼び出す行で引数エラーが発生します。

私のマクロスキルはかなり弱いです。何が間違っていますか? :)

4

1 に答える 1