添加更多字段以设计新的注册视图,从而导致ActiveRecord :: StatementInvalid错误

时间:2017-02-05 14:06:19

标签: ruby-on-rails activerecord devise erb

我在使用rails的设计时非常天真。我刚为员工注册创建了默认视图,我的表包含默认设计用户字段(如密码,电子邮件等)以及我的自定义字段,例如first_namelast_name。在new.html.erb文件中,最初是这样的,

<h2>Sign up</h2>

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

  <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 "employees/shared/links" %>

我又添加了两个文本字段:

<h2>Sign up</h2>

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

  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name, autofocus: true %>
  </div>

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

  <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 "employees/shared/links" %>

但这两个参数first_namelast_name未在后调用中传递,因为我得到的错误是:

PG::NotNullViolation: ERROR: null value in column "first_name" violates not-null constraint DETAIL: Failing row contains (6, null, null, null, prabhjotsinghrai1@gmail.com, $2a$11$KpJ4wnRfgeJ.N7hqnamiyOMpABXtPw0VppB1KBV6sL4fpJs3pTLCS, null, null, null, 0, null, null, null, null, 2017-02-05 14:00:44.450243, 2017-02-05 14:00:44.450243). : INSERT INTO "employees" ("email", "encrypted_password", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"

我发现first_namelast_name未添加到INSERT查询中。你能救我一下吗?

1 个答案:

答案 0 :(得分:2)

当您添加到模型中的新属性不允许进行质量分配时,您可能遇到了问题。如果是这样,您需要使用first_namelast_name属性设置Devise的强参数,例如:

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
  end
end

有关详细信息,请参阅Devise Strong Parameters

PS 您可能希望为first_namelast_name的存在添加验证,因为您可以更好地处理错误(而不是从Postgres获取错误)