Open2

Rodauthドキュメント翻訳

utamoriutamori

http://rodauth.jeremyevans.net/rdoc/files/doc/guides/alternative_login_rdoc.html

メールアドレス以外の識別子でのログインを使用する

Rodauthでは、現在最も一般的な識別子であるメールアドレスを、ユーザーの識別にデフォルトで使用しています。しかし、場合によっては、ユーザー名のような別の識別子でのログインを許可したいこともあるでしょう。このような場合、ログイン用のカラム名を :username のように別のものにするとよいでしょう。これにより、ログインフィールドにメールアドレスが入力されないようにすることができます。

plugin :rodauth do
  enable :login, :logout
  login_column :username
end

電子メールの送信を必要とするRodauth機能には電子メールアドレスが必要で、デフォルトでは送信にloginカラムの値が使用されることに注意してください。アカウントにユーザー名とメールアドレスの両方がある場合は、loginカラムにユーザー名を指定し、メールアドレスにはemail_toでemailカラムの値を使用することができます。

plugin :rodauth do
  enable :login, :logout, :reset_password

  login_column :username
  email_to do
    account[:email]
  end
end

別の方法としては、メールアドレス以外の識別子でログインを受け付けて、内部的に自動でメールアドレスに変更する方法があります。accountsテーブルにusernameフィールドがあれば、ログイン時にemailではなくusernameを入力できるようにRodauthを設定することができます。登録時にフィールドを追加する必要がある場合は、新規登録フィールドの追加ガイドを参照してください。

plugin :rodauth do
  enable :login, :logout

  account_from_login do |login|
    # ログインパラメータがユーザ名の場合の処理
    unless login.include?("@")
      login = db[:accounts].where(username: login).get(:email)
    end

    super(login)
  end
end
utamoriutamori

http://rodauth.jeremyevans.net/rdoc/files/doc/guides/registration_field_rdoc.html

アカウント登録時に新規フィールドを追加する

アカウント作成フォームは、デフォルトではログインとパスワードのパラメータのみを扱います。しかし、アカウント作成時には、ユーザーのフルネームや会社名の入力を求めるなど、追加の情報を求めることができます。

Accountテーブルに追加する

フィールドをaccountsテーブルに直接追加します

atler_table :accounts do
  add_column :name, String
end

create-accountテンプレートをオーバーライドする必要があります。Rodauthのデフォルトでは、Roda viewsディレクトリにcreate-account.erbテンプレートを追加することでオーバーライドできます。

create-account.erbテンプレートを追加し、nameフィールドを含むようにしたら、アカウント作成前のフックでそのフィールドの送信を処理することができます。

plugin :rodauth do
  enable :login, :logout, :create_account

  before_create_account do
    # nameフィールドの存在を検証
    unless name = param_or_nil("name")
      throw_error_status(422, "name", "must be present")
    end

    # accountレコードに新しいフィールドを割り当てます
    account[:name] = name
  end
end

別テーブルに追加する

または、次のように、追加のフィールドを別のテーブルに保存することもできます。

create_table :account_names do
  foreign_key :account_id, :accounts, primary_key: true, type: :Bignum
  String :name, null: false
end

次に、新しく送信されたフィールドを次のように処理できます。

plugin :rodauth do
  enable :login, :logout, :create_account

  before_create_account do
    # nameフィールドの存在を検証
    throw_error_status(422, "name", "must be present") unless param_or_nil("name")
  end

  after_create_account do
    # 関連したレコードを作成
    db[:account_names].insert(account_id: account[:id], name: param("name"))
  end

  after_close_account do
    # 関連したレコードを削除
    db[:account_names].where(account_id: account[:id]).delete
  end
end