为什么我没有得到有错误的字段?Michael Hartl 教程 ch. 7.3.3

why I don't get a field with errors? Michael Hartl Tutorial ch. 7.3.3

提问人:soevergreeen 提问时间:11/8/2023 最后编辑:soevergreeen 更新时间:11/14/2023 访问量:127

问:

我按照列表中的指示填写了所有文件,但是当我输入无效数据时,我没有收到错误字段。 我已经重新启动了几次 rails 服务器,但没有任何改变。 具有无效数据的测试会根据需要通过。

我的“应用程序/视图/用户/new.html.erb”文件:

<% title "Sign up" %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

我的“app/controllers/users_controller.rb”文件:

class UsersController < ApplicationController
  
  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      #
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password, 
                                   :password_confirmation)
    end
end

我的“app/models/user.rb”文件:

class User < ApplicationRecord
  before_save { email.downcase! }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEXP = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
    format: { with: VALID_EMAIL_REGEXP },
    uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, length: { minimum: 6 }
end

和我的“app/views/shared/_error_messages.html.erb”文件:

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

点击,当我单击“创建我的帐户”时,这只是刷新页面

upd:我用 Michael Hartl 存储库中的代码仔细检查了我的代码,但我没有发现任何奇怪的地方,也许我使用的 gem 发生了一些变化。

HTML Ruby-on-Rails 红宝石

评论

0赞 jamesc 11/8/2023
您是否为 error_explanation div 和 alert alert-danger css 类设置了正确的 css 样式?css 名称通常是连字符而不是下划线,所以我本来希望error_explanation是错误解释,无论如何,您仍然应该看到 errors 数组的输出。将控制器操作中对象的输出记录到控制台以检查对象的状态可能是一个想法。@user@user
0赞 jamesc 11/8/2023
我还将在 errors partial 中使用局部变量,并在调用中将对象从视图传递到,因为这将使您的共享部分可用于任何对象,而不仅仅是用于用户render
0赞 spickermann 11/8/2023
您的控制器和型号是什么样子的?
0赞 zaphodbln_ 11/8/2023
您的 model/user.rb 中是否有所需的验证?
0赞 soevergreeen 11/8/2023
是的,我认为我正确填写了 css 文件,但即使我在那里更改了某些内容,我也看不到与错误字段相关的更改

答:

0赞 soevergreeen 11/14/2023 #1

在一个存储库中,我找到了 rails 版本 7 的解决方案,在 rails 5 中,一切都可以使用我上面提供的代码,但在版本 7 中,为了显示错误字段,您需要添加一个 HTTP 状态代码。 在控制器文件中添加 after 解决了我的问题。status: :unprocessable_entityrender 'new'