序言
作为对问题的一点设置,我们有一个可验证的用户模型,它与包含非验证相关数据的用户模型分离。
问题
如标题所示,将自定义字段添加到内置
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
我们需要允许的字段,因此在device生成的控制器中,我取消了几行注释,并添加了相关逻辑:
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
这很管用,但感觉不太对劲。我觉得我
应该
能够使用内置的
configure_sign_up_parameters
设计提供的方法,但我不知何故做错了什么。提前感谢你的帮助。