【问题标题】:Rails 4: validate two type of users in a single User model using DeviseRails 4:使用 Devise 在单个用户模型中验证两种类型的用户
【发布时间】:2017-03-29 23:14:24
【问题描述】:

我正在使用 Rails 4 和 Devise gem,我的用户模型称为 User (app/models/user.rb)。我想要的是在我的用户数据库表中存储两种不同类型的用户,个人帐户和企业帐户。

我的用户模型如下所示:

个人帐户字段验证

validates :first_name, :email, :gender, :date_of_birth, :last_name, presence: true, if: :personal_account?    

企业帐户字段验证

validates :company, :zip, :representante, :founders, :founded_date, :address, :city, :country, :state, :sector, presence: true, if: :business_account?
validates_length_of :zip, minimum: 5, too_short: 'please enter at least 5 characters', if: :business_account? 

在views/devise/registrations/new 中,我有两个radio_button 可以在个人帐户和企业帐户之间进行选择,我在用户模型中使用它们来过滤和验证字段。

def personal_account?
 self.account_type == "Personal Account"
end

def business_account?
 self.account_type == "Business Account" 
end

我在 Devise 验证的两个帐户之间也有公共字段。常用字段有:

 email
 password
 password_confirmation

我可以毫无问题地创建个人帐户。但是,当我为企业帐户选择 radio_button 时,填写所有字段并尝试提交表单,这将不起作用,在电子邮件和密码字段上给我一个“不能不为空”的验证错误。

views/devise/registrations/new.html.erb 看起来像这样:

  <%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    
      <%= f.radio_button :account_type, 'Personal Account', checked: 'checked', wrapper_html: { class: 'radioName'}, data: {behavior: "clickable"} %><span class="ratiospace"></span><span>Personal Account<span class="space"></span></span>
          
      <%= f.radio_button :account_type, 'Business Account', wrapper_html: { class: 'radioName'}, data: {behavior: "clickable"} %><span class="ratiospace"></span><span>Business Account</span>

     #more code below   

我不想为个人帐户和企业帐户设置两种不同的模型,因为我正在使用一个电子商务 gem,它只需要一个模型来代表我的应用中的用户。我也认为我不需要创建角色模型,因为已经在电子商务中实现了 cancan 能力。

任何帮助将不胜感激。非常感谢您。

【问题讨论】:

    标签: ruby-on-rails validation devise


    【解决方案1】:

    我很想尝试如下所示的自定义验证器:

    http://guides.rubyonrails.org/active_record_validations.html

    class UserValidator < ActiveModel::Validator
      def validate(record)
        if record.business_account?
          if (there's a field missing)...
            record.errors[:base] << "Invalid business account"
          end
        elsif (record.personal_account?)
          ... some other validation
        end
      end
    end
    
    class User < ApplicationRecord
      validates_with GoodnessValidator
    end
    

    【讨论】:

    • Patrice 感谢您的回答,但我尝试过但没有成功。除常用字段 email、passowrd 和 password_confirmation 外,所有业务帐户字段都经过验证。这些常用字段在我创建个人帐户时验证,但在我切换到企业帐户并尝试创建帐户时不会验证。真的不知道怎么回事?我想可能是我调用来隐藏或显示字段的 jquery。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多