如何添加自定义字段来设计忘记密码?

时间:2016-08-31 12:50:09

标签: ruby-on-rails forms devise

让我先说一下我是一名Java开发人员,但我的团队正在为我们的产品开发一个SSO微服务,因此我正在学习。

目前我已将其设置为在用户将电子邮件输入此表单时发送密码重置确认:

<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
<%= devise_error_messages! %>
    <div class="row">
        <div class="medium-12 small-12">
            <div class="field">
                <%= f.label :email, class: 'field-label' %>
                <%= f.email_field :email, autofocus: true %>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="actions columns medium-12 small-12">
            <%= f.submit "Send", id: "send-button" %>
        </div>
    </div>

    <div class="row text-center align-center">
        <div class="small-8 small-centered columns">
            <br><p id="form-subheading">* For security reasons, we do NOT store your password. We will NEVER send your password via email.</p>
        </div>
    </div>
<% end %>

它成功通过了class Users::PasswordsController < Devise::PasswordsController

中的以下功能
# POST /resource/password
def create
 super
end

现在问题是我们需要将以下first_namelast_name字段添加到表单中,并在将表单发送到他们的电子邮件之前对User模型进行身份验证,但它完全忽略这些参数。显然,我需要在某处检查,但不知道从哪里开始。

<div class="row">
    <div class="medium-5 small-12">
        <div class="field">
            <%= f.label :first_name, class: 'field-label' %>
            <%= f.text_field :first_name %>
        </div>
    </div>
    <div class="medium-6 medium-offset-1 small-12">
        <div class="field">
            <%= f.label :last_name, class: 'field-label' %>
            <%= f.text_field :last_name %>
        </div>
    </div>
</div>

我知道它们会被发送到后端,因为params[:user]变量包含信息,如果我在函数中放入byebug语句。我只是不确定如何验证表单中的新信息。

任何有关为此表单构建自定义字段的帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

当然,在找了一个小时后我发布了SO,我立即在文档中找到了我需要的内容。

原来我需要:

# config/initializers/devise.rb
config.reset_password_keys = [:email]

并将其更改为

config.reset_password_keys = [:email, :first_name, :last_name]

答案 1 :(得分:0)

在您的用户模型中,您可以验证这些字段。像这样:

validates :first_name, presence: true
validates :last_name, presence: true

发送表单后,在模型中验证它们。如果first_name和/或last_name未填写,则会返回到表单。 Read this for more information about rails validations

同样在你的控制器中你必须接受参数(如果你还没有)。

def user_params
  params.require(:user).permit(:first_name, :last_name)
end

在您的用户控制器中,您可能已经拥有def user_params,只需添加first_namelast_name即可。

之后你可以像往常一样访问这些参数。 (例如:在create函数@user = User.new(user_params)中,您将@user.first_name。)