Сообщения об ошибках формы, не генерируемые в приложении Rails

Привет, у меня есть простое приложение, которое я создаю, и у меня возникают проблемы с отображением сообщений об ошибках, когда кто-то вводит неверную информацию или ее вообще нет в поле.

Форма, которую я использую, предназначена для регистрации нового пользователя, код, связанный с пользователем, и форма приведены ниже;

users_controller.rb

Class UsersController < ApplicationController


  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @country = Country.all
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
      redirect_to @user
    else
      redirect_to '/signup'
    end
  end


  private 

    def user_params
        params.require(:user).permit(:first_name, :last_name, :email, :password)
    end


end

user.rb

class User < ApplicationRecord

  before_save { self.email = email.downcase }
  validates :first_name, presence: true, length: { maximum: 25 }
  validates :first_name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }

  has_many :trips
  has_many :countries, through: :trips

end

new.html.erb

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

        <%= f.label :first_name %>
        <%= f.text_field :first_name, class: "form-control" %>

        <%= f.label :last_name %>
        <%= f.text_field :last_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.submit "Create an account", class: 'form-control btn btn-primary' %>
      <% end %> 
    </div>
  </div>
</div>

_error_messages.html.erb

<% if @user.errors.any? %>
  <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>
<% else %>
  <h3>test</h3>
<% end %>

Когда я загружаю форму, я вижу строку "Test", которую я помещаю в свой _error_messages.html.erb для наглядности. Однако, когда я ввожу данные на странице регистрации, она перезагружает страницу (как следует, а не отправляет ее на страницу пользователя, когда все поля действительны). Однако строка "Test" по-прежнему отображается вверху, а не сообщения об ошибках, которые должны появиться.

Я предполагаю, что мне нужен какой-то сеанс или что-то еще, чтобы вспомнить, какие были ошибки, так как сейчас он перезагружает совершенно новую страницу без памяти, однако я не могу найти решение этой проблемы нигде в данный момент.

Любая помощь приветствуется!

1 ответ

Решение

Как я уже сказал, вам нужно изменить

redirect_to '/signup' 

в

render 'new'

Из гидов

render Метод используется так, чтобы @user объект передается обратно в new шаблон, когда он отображается. Этот рендеринг выполняется в рамках того же запроса, что и отправка формы, тогда как redirect_to скажет браузеру выдать еще один запрос.

Тем не менее, так как redirect_to выдает новый запрос в браузер, значения @user другими словами @user это новый экземпляр, который создается снова Поэтому <% if @user.errors.any? %> всегда возвращается false как будто нет ошибок в @user,

Другие вопросы по тегам