如何使用设计在登录时设置掩码并仅在数据库中保存数字

How put mask on login with devise and save on DB just numbers

我有我的登录表单和我的 js 掩码,一切正常。但是我把代码放在哪里:

cpf.gsub!(/(\.|\-)/, "")

面具工作?

我需要生成设备的控制器用于登录还是仅用于模型?我需要用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  before_validation do
    self.cpf.gsub!(/(\.|\-)/, "")
  end
end

但它只适用于注册用户,不要登录。 我的登录名是这样的:

<div class="login">
  <div class="panel panel-default">
    <div class="panel-heading"><h4 class="cor-texto">AUTENTICAÇÃO DO USUÁRIO</h4></div>
    <div class="panel-body">
      <%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
      <div class="form-inputs">
        <div class="form-group">
          <%= f.input :cpf, required: false, autofocus: true, input_html: { class: 'form-control mascara-cpf' }, placeholder: 'LOGIN', label: false %>
        </div>
        <div class="form-group">
          <%= f.input :password, required: false, input_html: { class: 'form-control' }, placeholder: 'SENHA', label: false %>
        </div>
        <div class="espaco-check-box-login">
          <%= f.input :remember_me, label: 'Lembre-me', as: :boolean if devise_mapping.rememberable? %>
        </div>
      </div>
      <div class="form-actions">
        <%= f.button :submit, "Log in", :class => "btn btn-default btn-lg btn-block" %>
      </div>
      <% end %>
    </div>
  </div>
</div>

我的面具工作成形式,但保存在 DB 上。和 - 因为我无法登录系统 =(

查看 this,它解释了 before_validation 的工作原理

Defines a callback that will get called right before validation happens.

它不会工作,因为您正尝试在登录操作中执行 POST 请求,这不会调用 before_validation。

我建议你做的是在通过 js 提交表单之前,或者在你的控制器中调用身份验证方法之前取消屏蔽值。

希望对您有所帮助!

根据设计文档,一个好方法是,在您的 user.db 中覆盖登录查询,例如:

def self.find_for_database_authentication(warden_conditions)
     conditions = warden_conditions.dup
     if cpf = conditions.delete(:cpf)
          logger.debug cpf.gsub!(/[^\d]/, '')
          where(conditions).where(["cpf = :value", { :value => cpf }]).first
end