【问题标题】:Adding additional field and validation to Devise view/model in Rails app在 Rails 应用程序中向设计视图/模型添加附加字段和验证
【发布时间】:2011-04-11 05:03:43
【问题描述】:

我生成了默认的devise 视图:

rails generate devise:views

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

目前,只进行emailpassword 验证。如何验证 username 字段的存在性和唯一性?我需要向User 模型添加一些东西吗?

【问题讨论】:

    标签: ruby-on-rails validation devise


    【解决方案1】:

    我使用了其他答案中提到的教程Railscast #210Devise 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  
    

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

    【讨论】:

    • 我按照你说的做了 validates_presence_of :username 和 validates_uniqueness_of :username 在我的“用户”模型中,当错误出现时我会怎么做,“名称错误”是列表中的第一个,错误,何时显示?
    【解决方案2】:

    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
    

    This is described in Devise Doc

    另外,我对username 的验证如下:

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

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

    【讨论】:

    • 如果验证失败,您将如何保留这些新参数?目前,只保留电子邮件。
    • 嗯...我现在无法检查,但我会先检查控制器并确保它返回包含这些值的 @user 对象。也许电子邮件是唯一记录的字段,因为对象是空的,浏览器会填写它。只是从臀部拍摄
    • 还要检查模板是否以相同的动作呈现并且没有重定向,在这种情况下,@user 将再次为空。如果您已覆盖视图,请在视图中检查值是否存在。
    【解决方案3】:

    如果有人想知道如何登录以检查用户名是否为空 或确保用户不能拥有相同的用户名。我花了好几 几个小时试图弄清楚这一点,在 ned 中我只需要添加:

    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 中

    【讨论】:

      【解决方案4】:

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

      希望对你有帮助。

      【讨论】:

      • 该链接已损坏。也许下次您可以在答案中加入必要的信息?
      • 链接现在重定向到设计 wiki 的顶层。由于我不知道 Wiki 在那里,我发现该链接很有帮助。可能现在的具体答案是 github.com/plataformatec/devise/wiki/…,尽管正如 lashleigh 所说,那篇文章没有解决 验证模型中的用户名。
      • 这在 Rails 4 中不再适用了。这不再容易了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多