【问题标题】:Rails 4 - Error Messages for Email ValidationRails 4 - 电子邮件验证的错误消息
【发布时间】:2015-04-15 01:21:06
【问题描述】:

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

查看

<%= form_tag("/thank_you") do %>
              <% if @fullmessage.errors.any? %> # <----- This line
                <h3>Errors</h3>
                <ul>
                <% @fullmessage.errors.full_messages.each do |message| %> # Would also cause an error if exemption not already raised
                  <li><%= message %></li>
                <% end %>
                </ul>
              <% end %>
              <div class="row">
                <div class="col-md-5">
                  <div class="form-group">
                      <%= text_field_tag :first_name, nil, class: 'form-control', placeholder: 'First Name' %>
                  </div>
                </div>
                <div class="col-md-7">
                  <div class="form-group">
                      <%= text_field_tag :last_name, nil, class: 'form-control', placeholder: 'Last Name' %>
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-12">
                  <div class="form-group">
                    <%= text_field_tag :email, nil, class: 'form-control', placeholder: 'Email Address' %>
                  </div>
                </div>
              </div>
              <div class="row">
                <div class="col-md-12">
                  <div class="form-group text-area-wide">
                    <%= text_area_tag :message, nil, class: 'form-control text-area-wide', placeholder: 'When are you available?' %>
                  </div>
                </div>
              </div>
              <%= submit_tag 'Get Started', class: 'btn btn-success' %>
              <p><a href="http://www.skype.com/en/" target="_blank">Skype</a> required</p>
            <% end %>

控制器

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

【问题讨论】:

    标签: ruby-on-rails validation email


    【解决方案1】:

    你有两个选择:

    1. 使用render 而不是重定向到(这样您将保留您的@fullmessage 对象。
    2. 将错误保存到flash[:alert]并在视图中显示

    第二个选项更通用,您可以将相关代码添加到布局中并在整个站点中使用。例如:

    <% if !flash.empty? %>
        <div id="flash">
          <% flash.keys.each do |k| %>
              <div class="alert alert-<%= k %>">
                <%= flash[k] %>
              </div>
          <% end %>
        </div>
    <% end %>
    

    【讨论】:

    • 谢谢。作为对选项 1 的响应,这不会改变我得到的错误。可能是因为在thank_you 操作中定义了@fullmessage。 (错误是针对索引操作的)(编辑以显示这一点)关于选项 2,我将如何根据模型中失败的验证设置密钥?
    • flash[:alert] = @fullmessage.errors.full_messages.to_sentence
    【解决方案2】:

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

    当您重定向时,@fullmessage 值将一无所有,因为 http 是无状态的。如果没有缓存和 cookie,每个请求都会重新创建每个变量。认为您正在尝试做的是显示闪存消息,如果是这种情况,您可以将 @fullmessage.errors 添加到闪存并能够在重定向上显示它。

    【讨论】:

    • 谢谢。回顾这个 [问题] (stackoverflow.com/questions/9390778/…) 我不确定如何根据在给定情况下失败的验证来为每条闪存消息设置密钥。想法?
    • 我的问题可能不清楚。我的意思是问我如何设置模型给出的键的值(大概)。例如,如果验证失败是电子邮件验证,我需要告诉 rails 给出一条错误消息,上面写着“电子邮件格式不正确”。所以rails会给我一些指示电子邮件字段错误的键,我会设置输出。也许有一长串if ifelse? if @fullmessage.first_name.valid -> 将值设置为“名字错误” elseif @fullmessage.last_name.valid? -> 将值设置为“姓氏错误”?
    • flash[:warning] @fullmessage.full_messages.first 或者如果你想要它们全部映射它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2017-08-21
    • 1970-01-01
    • 2015-05-20
    • 2021-03-26
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多