代码之家  ›  专栏  ›  技术社区  ›  Matthew

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

  •  1
  • Matthew  · 技术社区  · 8 年前

    序言

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

    问题

    如标题所示,将自定义字段添加到内置 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 设计提供的方法,但我不知何故做错了什么。提前感谢你的帮助。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Matthew    8 年前

    <%= 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"
        }
    }