作为对问题的一点设置,我们有一个可验证的用户模型,该模型与包含非身份验证相关数据的用户模型分开。
正如标题所示,向内置configure_sign_up_params
方法添加自定义字段实际上并不允许create
操作中的字段。我已使用rails generate devise:controllers user
和rails 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
方法,但我不知何故做错了什么。提前感谢帮助。
答案 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"
}
}