私はデフォルトのデバイスビューを生成しました:
rails generate devise:views
次に、フォームにusername
フィールドを追加しました。views/devise/registrations/new.html.erb
現在、email
およびpassword
検証のみが行われます。username
フィールドの存在と一意性を検証するにはどうすればよいですか? User
モデルに何かを追加する必要がありますか?
私はデフォルトのデバイスビューを生成しました:
rails generate devise:views
次に、フォームにusername
フィールドを追加しました。views/devise/registrations/new.html.erb
現在、email
およびpassword
検証のみが行われます。username
フィールドの存在と一意性を検証するにはどうすればよいですか? User
モデルに何かを追加する必要がありますか?
他の回答で言及されているチュートリアル、Railscast #210とDevise Wikiの両方を使用しました。ただし、私が知る限り、ユーザー名フィールドの存在および/または一意性を検証する方法を明示的に述べていません。
単純な移行でユーザー名を追加した場合 -
rails generate migration addUsernameToUser username:string
その場合、devise はそのフィールドに対して特別なことを何もしないので、User モデルで検証と一意性のチェックを自分で追加する必要があります。
class User < ActiveRecord::Base
...
validates_presence_of :username
validates_uniqueness_of :username
ただし、RailsCast #209 を見ると、User モデルの作成に使用される移行の例があります。
class DeviseCreateUsers < ActiveRecord::Migration
def self.up
create_table(:users) do |t|
t.database_authenticatable :null => false
# t.confirmable
t.recoverable
t.rememberable
t.trackable
# t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
t.timestamps
end
add_index :users, :email, :unique => true
# add_index :users, :confirmation_token, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :unlock_token, :unique => true
end
def self.down
drop_table :users
end
end
ここで、ユーザーの電子メールが一意であると定義されていることに注意してください。おそらく、この同じ構文を使用してユーザー名が追加された場合、devise マジックが存在と一意性を処理します。
Rails 4 と強力なパラメーター
上記に加えて、次の方法でビューを生成する必要がありました。
$ rails g devise:views
次にdevise.rb
追加で:
config.scoped_views = true
最後に、許可されたパラメータを以下のように設定しsign_up
ます。
class ApplicationController < ActionController::Base
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit :username, :email, :password, :password_confirmation
end
end
end
また、私の検証username
は次のとおりです。
validates :username, presence: true
validates :username, uniqueness: true, if: -> { self.username.present? }
私は 2 行を使用しているので、username
が空白の場合、エラーは 1 つしか発生しません。
ユーザー名が空白かどうかを確認するため、またはユーザーが同じユーザー名を持つことができないことを確認するために、ログインを取得する方法を誰かが疑問に思っている場合。私はこれを理解するのにかなりの時間を費やしましたが、ネッドで追加するだけで済みました:
validates_uniqueness_of :username, case_sensitive: false
validates_presence_of :username
app/models/ の user.rb ファイルに
ここにドキュメントがあります... https://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
これで必要なエラーがスローされます。最初に uniquness_of を見つけてから戻って空白のフィールドをチェックする方法を見つけようとして何時間も費やした後、それが他のドキュメントと同じドキュメントにあることがわかったので、私はばかのように感じます...私は初心者です。
エラーメッセージはdevise.en.ymlにないため、エラーメッセージを変更する方法を理解してください
User モデルと Devise wiki にユーザー名フィールドを追加するだけです: http://github.com/plataformatec/devise/wiki/Sign-in-using-login-or-mail
それが役に立てば幸い。