表单错误消息不在Rails应用程序中生成

时间:2017-07-25 10:23:47

标签: ruby-on-rails ruby forms model error-messaging

嗨我有一个简单的应用程序正在构建,当有人在某个字段中输入无效信息或根本没有信息时,会出现错误消息。

我使用的表单是注册新用户,与用户和表单相关的代码如下;

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 %>

当我加载表单时,我会看到&#34;测试&#34;字符串,我放在我的_error_messages.html.erb中以获得可见性。但是,当我在注册页面中输入数据时,它会重新加载页面(因为它应该而不是在所有字段都有效时将其发送到用户页面)。然而,&#34;测试&#34;字符串仍然出现在顶部而不是应该的错误消息。

我的假设是我需要某种会话或某些东西来记住错误是什么,因为现在它重新加载一个没有任何内存的全新页面,但是,我目前无法在任何地方找到解决方案。< / p>

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

正如我所说,你需要改变

redirect_to '/signup' 

render 'new'

来自Guides

  

使用render方法,以便传回@user个对象   呈现时new模板。此渲染在内部完成   与表单提交相同的请求,而redirect_to将   告诉浏览器发出另一个请求。

也就是说,当redirect_to向浏览器发出新请求时,@user的值会丢失,换句话说@user是再次实例化的新实例。这就是<% if @user.errors.any? %> 始终返回false的原因,就像@user中没有错误一样。