Сообщения об ошибках формы, не генерируемые в приложении 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
,