Techioz Blog

フィールドにエラーが表示されないのはなぜですか?マイケル・ハートル チュートリアル ch. 7.3.3

概要

リストに示されているようにすべてのファイルを入力しましたが、無効なデータを入力してもエラー フィールドが表示されません。 Railsサーバーを数回再起動しましたが、何も変わりませんでした。 無効なデータを含むテストは必要に応じてパスされます。

私の「app/views/users/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 で何かが変更されたのでしょう。

解決策

あるリポジトリで、Rails バージョン 7 のソリューションを見つけました。Rails 5 では、上記で提供したコードですべてが機能しましたが、バージョン 7 では、エラー フィールドを表示するには、HTTP ステータス コードを追加する必要があります。 コントローラーファイルに「new」をレンダリングした後に status: :unprocessable_entity を追加すると、問題が解決しました。