在Rails应用程序中为Devise视图/模型添加其他字段和validation

我生成了默认的设计视图:

rails generate devise:views 

然后我在views/devise/registrations/new.html.erb表单中添加了一个username views/devise/registrations/new.html.erb

目前,仅进行emailpasswordvalidation。 如何validationusername段的状态和唯一性? 我是否需要在User模型中添加一些内容?

我使用了其他答案中提到的教程, Railscast#210和Devise Wiki 。 但是,据我所知,他们没有明确说明如何validation用户名字段的存在和/或唯一性。

如果您通过简单的迁移添加了用户名 –

 rails generate migration addUsernameToUser username:string 

然后设计对该字段没有任何特殊之处,因此您需要在用户模型中自己添加对validation和唯一性的检查。

 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 

请注意,用户电子邮件被定义为唯一的。 也许如果使用相同的语法添加用户名,那么设计魔术会处理存在和唯一性。

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 

这在Devise Doc中有所描述

此外,我对usernamevalidation如下:

 validates :username, presence: true validates :username, uniqueness: true, if: -> { self.username.present? } 

我使用两行,所以如果username名为空,我只会收到一个错误。

只需在您的用户模型和Devise wiki上添加用户名字段: http : //github.com/plataformatec/devise/wiki/Sign-in-using-login-or-mail

希望能帮助到你。