邪恶的多步验证:验证失败:街道不能为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了邪恶的多步验证:验证失败:街道不能为空相关的知识,希望对你有一定的参考价值。

我有一个多步骤表格。这有点复杂,基本上导致首先通过注册控制器创建用户,然后将用户重定向到表单。准确地说,它不是多步骤表单,而是更多的两步注册。用这些进行验证是很麻烦的,但是我想出了可行的方法。在我的User.rb中,我定义了如下验证:

validates :first_name, presence: true, :on => :create
validates :last_name, presence: true, :on => :create
validates :street, presence: true, :on => :update

但是现在我遇到了问题,在该更新步骤中向用户显示错误。我的UserStepsController中有更新操作:

class UserStepsController < ApplicationController
    include Wicked::Wizard
    steps :address
    #respond_to :html, :js

    def show
      @user = current_user || User.from_omniauth(request.env["omniauth.auth"])
      render_wizard
    end


    def update
      @user = current_user || User.from_omniauth(request.env["omniauth.auth"])
        if @user.update!(user_params)
            render_wizard @user
        else
            render :show
        end
    end


    private

    def user_params
        params.require(:user).permit(:email, :password, :password_confirmation, :remember_me, :first_name, :last_name, :street, :house_number, :city, :zip_code)
    end

    def redirect_to_finish_wizard(options = nil, params = nil)
        redirect_to new_user_profile_path(current_user)
    end

end

因此,如果无法更新用户,导致验证失败,我希望显示错误信息。为此,我在address.html.erb中定义了此行为:

<%= form_for @user, url: wizard_path do |f| %>
    <% if @user.errors.any? %>
        <div class="error_explanation">
            <h2><%= pluralize(@user.errors.count, "error") %> prevented this record from being saved:</h2>
                <ul>
                    <% @user.errors.full_messages.each do |message| %>
                        <li><%= message %></li>
                    <% end %>
                </ul>
        </div>
    <% end %>

        <div class="row second 1">
            <div class="column">
              <div class="field wizard">
                <%= f.label :street %><br />
                <%= f.text_field :street, class: 'form-control' %>
              </div>
            </div>

这不会显示错误,但会引发活动记录错误:

ActiveRecord::RecordInvalid in UserStepsController#update
Validation failed: Street can't be blank

提取的来源(第14行附近):

12 def update
13 @user = current_user || User.from_omniauth(request.env["omniauth.auth"])
14 if @user.update!(user_params)
15 render_wizard @user
16 else
17 render :show

我在做什么错?

答案

update vs update!。如果我还记得update!在模型上运行save!而不是save。这意味着如果记录无效,它将运行异常。 update将尝试调用运行验证的save方法

另一答案

问题是更新操作。我将其更改如下。

def update
      @user = current_user || User.from_omniauth(request.env["omniauth.auth"])
        if @user.update_attributes(user_params)
            render_wizard @user
        else
            render :address
        end
    end

我也可以改变观点,以引导共享的错误消息:

<%= form_for @user, url: wizard_path do |f| %>
<%= render "devise/shared/error_messages" %>

这对创建和更新@user都有效:

<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-error">
      <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |message| %>
      <li>* <%= message %></li>
    <% end %>
    </ul>
  </div>
<% end %>

以上是关于邪恶的多步验证:验证失败:街道不能为空的主要内容,如果未能解决你的问题,请参考以下文章

使用 Auth0 的 Azure 应用服务 OpenID 身份验证失败:值不能为空。 (参数'rawToken')

“验证错误:密码不能为空”但表单中没有密码字段

反应采取错误验证的多步骤形式

对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

php输出网页源代码莫名奇妙的多了一堆方框,导致ajax验证失败.

JAVA连接LDAP(Windows AD)验证时,密码为空验证通过的问题?