Ruby on rails Rails 4-电子邮件验证的错误消息

Ruby on rails Rails 4-电子邮件验证的错误消息,ruby-on-rails,validation,email,Ruby On Rails,Validation,Email,我正在将一封电子邮件保存到数据库中,然后将其发送。我使用电子邮件模型来验证输入,但我不确定如何显示错误消息。我得到一个未定义的nil方法'errors':fullmessage的NilClass error.errors.any?索引操作中的行(下面突出显示) 看法 模型 class电子邮件25,:min=>2 验证的长度为:first\u name,:max=>30,:min=>2 验证以下内容的格式:电子邮件,:with=>/\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z

我正在将一封电子邮件保存到数据库中,然后将其发送。我使用电子邮件模型来验证输入,但我不确定如何显示错误消息。我得到一个未定义的nil方法'errors':fullmessage的NilClass error.errors.any?索引操作中的行(下面突出显示)

看法

模型

class电子邮件25,:min=>2
验证的长度为:first\u name,:max=>30,:min=>2
验证以下内容的格式:电子邮件,:with=>/\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z]{2,})\z/i
验证消息的长度,最大值=>500,:最小值=>20
结束

Nil类表示@fullmessage为Nil且尚未设置,且Nil没有方法错误,因此出现错误

重定向时,@fullmessage值将没有任何内容,因为http是无状态的。在没有缓存和cookie的情况下,每个请求都会重新创建每个变量。想一想你要做的是显示flash消息,如果是这种情况,你可以将@fullmessage.errors添加到flash中,并能够在重定向上显示它

您有两个选择:

  • 使用
    render
    而不是重定向到(这样您将保留
    @fullmessage
    对象)
  • 将错误保存到
    flash[:alert]
    并在视图中显示
  • 第二个选项更通用,您可以将相关代码添加到布局中,并在整个站点中使用。例如:

    <% if !flash.empty? %>
        <div id="flash">
          <% flash.keys.each do |k| %>
              <div class="alert alert-<%= k %>">
                <%= flash[k] %>
              </div>
          <% end %>
        </div>
    <% end %>
    
    
    
    谢谢。回顾此[问题]()我不确定如何根据在给定情况下失败的验证为每条flash消息设置密钥。想法?我的问题可能不清楚。我的意思是问如何设置密钥的值(大概是这样的)由模型给出。例如,如果验证失败的是电子邮件验证,我需要告诉rails给出一条错误消息,上面写着“不正确的电子邮件格式”。因此rails会给我一些指示电子邮件字段错误的键,我会设置输出。可能有一长串if-if-else?if@fullmessage.first_name.valid->set v将值设置为'first name error'elseif@fullmessage.last_name.valid?->将值设置为'last name error'?flash[:warning]@fullmessage.full_messages.first,或者您可以将它们全部映射。谢谢。作为选项1的响应,这不会更改我收到的错误。可能是因为@fullmessage是在“谢谢”操作中定义的。(错误是针对索引操作的)(编辑以显示此内容)关于选项2,如何根据模型中失败的验证设置键?
    flash[:alert]=@fullmessage.errors.full_messages.to_句
    def thank_you
        @first_name = params[:first_name]
        @last_name = params[:last_name]
        @email = params[:email]
        @message = params[:message] || "Hello!"
        @fullmessage = Email.create(first_name: @first_name, last_name: @last_name, email: @email, message: @message)
        if @fullmessage.valid?
          ActionMailer::Base.mail(
              :from => @email, 
                :to => 'erikvdw@comcast.net', 
                :subject => "A new contact form message from #{@first_name} #{@last_name}", 
                :body => @message).deliver
        else
          redirect_to root_path
          flash[:alert] = 'There was an issue with your submission'
        end
      end
    
    class Email < ActiveRecord::Base
      validates_length_of :first_name, :maximum => 25, :minimum => 2
      validates_length_of :first_name, :maximum => 30, :minimum => 2
      validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      validates_length_of :message, :maximum => 500, :minimum => 20
    end
    
    <% if !flash.empty? %>
        <div id="flash">
          <% flash.keys.each do |k| %>
              <div class="alert alert-<%= k %>">
                <%= flash[k] %>
              </div>
          <% end %>
        </div>
    <% end %>