【问题标题】:How to add custom field to devise forgot my password?如何添加自定义字段以设计忘记密码?
【发布时间】:2016-08-31 12:50:08
【问题描述】:

首先我是一名 Java 开发人员,但我的团队正在为我们的 Rails 产品开发 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 &lt; Devise::PasswordsController中的如下函数

# POST /resource/password
def create
 super
end

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

<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 语句的信息。我只是不确定如何验证表单中的新信息。

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

【问题讨论】:

    标签: ruby-on-rails forms devise


    【解决方案1】:

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

    原来我需要:

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

    并将其更改为

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

    【讨论】:

      【解决方案2】:

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

      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。)

      【讨论】:

        猜你喜欢
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-20
        • 2011-12-19
        • 1970-01-01
        • 2018-06-18
        • 2012-01-07
        • 2015-12-21
        相关资源
        最近更新 更多