0

我有基于设计的模型机构:

class Agency < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :name, :email, :phone, :address, :city, :state, :zip,
                  :notes, :is_admin, :password, :password_confirmation, :remember_me

  protected

  def password_required?
   !persisted? || password.present? || password_confirmation.present?
  end
end

我也有基于 active_scaffold 的 AgenciesController:

class Admin::AgenciesController < Admin::BaseController
  before_filter :authorize_admin!

  active_scaffold :agency do |conf|
    actions.exclude :show

    create.link.page = true
    update.link.page = true

    list.columns = [
      :name, :email, :phone, :address, :city, 
      :state, :zip, :notes, :events, :is_admin
    ]

    create.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    update.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    columns.add :password
    columns.add :password_confirmation    

    columns[:password].form_ui = :password
    columns[:password_confirmation].form_ui = :password
  end
end 

然后是代理商更新表格:
在此处输入图像描述

我想为用户提供一个机会来省略密码和密码确认字段的填写。但如果用户填写密码字段,则必须要求密码确认字段。

我几乎通过 password_required 解决了我的问题?方法。但是客户端上的javascript需要验证不允许我完全解决我的问题。

在此处输入图像描述

如何从客户端删除密码和密码确认字段的 JS 验证?

4

2 回答 2

1

尝试:

validates_confirmation_of :password, :if => :password_required?

validates :password_confirmation, :presence => true, :if => '!password.nil?'

请注意,只有在password_required?返回 true 时才会触发验证,如果字段为 nil ,password_required?则将返回 false 。password_confirmation

因此,为了使password_confirmation字段为 nil,您只需password_confirmation从表单中删除该字段,这样您将始终将其设为 nil,从而绕过验证。

替代解决方案:

1)跳过密码字段的验证

2)只需在密码字段中保存一个随机安全生成的数字(更好,因为它很容易并且还保持一致性)。

self.password = self.password_confirmation = SecureRandom.urlsafe_base64(n=6)

此外,如果您希望这些字段应该以不同的方式标识为用户留下的,那么您可以为它们提供唯一的密码,以便稍后您施加如下条件:

if(self.password == "something unique" and self.password_confirmation == "something unique")
    flash[:notice] = "The user has not password"
end

然后在 UI 级别,您只需使用上述条件显示空白。

于 2013-02-06T11:44:12.740 回答
0

@Saurabh Jain,非常感谢您的建议。
但解决方案非常简单。
我发现 active_scaffold 为密码字段的输入标签添加了一个必需的属性。
换句话说,客户得到一个 html

<input type="password" required="required" size="30" name="record[password_confirmation]" id="record_password_confirmation_4" class="password_confirmation-input text-input" autocomplete="off">

完全需要的属性是我的问题:) 要从 html 中删除它,只需添加行

columns[:password].required = false;

到 Admin::AgenciesController 中的 active_scaffold 配置(见上面)

于 2013-02-06T14:00:40.090 回答