设计不允许的自定义注册参数

时间:2018-06-18 22:38:27

标签: ruby-on-rails devise

序言

作为对问题的一点设置,我们有一个可验证的用户模型,该模型与包含非身份验证相关数据的用户模型分开。

问题

正如标题所示,向内置configure_sign_up_params方法添加自定义字段实际上并不允许create操作中的字段。我已使用rails generate devise:controllers userrails generate devise:views user生成了相关的控制器和视图,并对两者进行了修改。在视图中:

<h2>Custom User Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <%= fields_for(:extra_user_attributes) do |pa| %>
    <div class="field">
      <%= pa.label :first_name %><br />
      <%= pa.text_field :first_name %>
    </div>

    <div class="field">
      <%= pa.label :last_name %><br />
      <%= pa.text_field :last_name %>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "user/shared/links" %>

我们有一个我们需要允许的嵌套:extra_user_attributes字段,因此在设计生成的控制器中,我取消注释了几行并添加了相关的逻辑:

class CustomUser::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  # POST /resource
  def create
    ap sign_up_params
  end

  protected

  # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:extra_user_attributes => [:first_name, :last_name]])
  end
end

这是我被卡住的地方。我在keys数组中尝试了几种排列,但到目前为止我尝试的所有内容都会产生相同的结果。为了我自己的理智,我验证了before_action确实触发了。

至于端点,我只是将输出打印到控制台,只是为了查看允许的注册参数是什么。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"5MqzDUsbrdMdE0Z7/Vw70zJddaKR+0eLYdnum3wEyTShNjB9o3Nb4ZsnE0dZEPlgs4SheZtQad0VpuIGtCeSmw==", "extra_user_attributes"=>{"first_name"=>"", "last_name"=>""}, "user"=>{"email"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

{
                    "email" => "",
                 "password" => "",
    "password_confirmation" => ""
}

我在这里遗漏了什么吗?

解决方法

解决方法是:

def other_signup_params
    params.require(:extra_user_attributes).permit(:first_name, :last_name)
end

哪种方法很好,但感觉不对。我觉得我 应该 能够使用Devise提供的内置configure_sign_up_parameters方法,但我不知何故做错了什么。提前感谢帮助。

1 个答案:

答案 0 :(得分:0)

问题不在于设计,而是我设置的嵌套参数的问题。

<%= fields_for(:extra_user_attributes) do |pa| %>
  <div class="field">
    <%= pa.label :first_name %><br />
    <%= pa.text_field :first_name %>
  </div>

  <div class="field">
    <%= pa.label :last_name %><br />
    <%= pa.text_field :last_name %>
  </div>
<% end %>

fields_for没有与父表单关联,因此成为孤立的。它应该显示为:

<%= f.fields_for(:extra_user_attributes) do |pa| %>

然后,消毒程序正确允许以下字段:

{
                    "email" => "foo@example.com",
                 "password" => "hello!",
    "password_confirmation" => "world!",
    "extra_user_attributes" => {
        "first_name" => "Foo",
         "last_name" => "Bar"
    }
}