簡體   English   中英

Rails 4-電子郵件驗證錯誤消息

[英]Rails 4 - Error Messages for Email Validation

我正在將電子郵件保存到數據庫,然后發送。 我正在使用電子郵件模型來驗證輸入,但是我不確定如何顯示錯誤消息。 我為nil:nilClass錯誤獲取了一個未定義的方法errors,該消息為fullmessage.errors.any? 索引動作中的行(下面突出顯示)

視圖

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

Nil類表示@fullmessage為nil並且尚未設置,並且nil沒有方法錯誤,因此是錯誤。

重定向時,@ fullmessage值將沒有任何內容,因為http是無狀態的。 由於沒有緩存和cookie,因此每個請求都會重新創建每個變量。 認為您要執行的操作是顯示Flash消息,如果是這種情況,可以將@ fullmessage.errors添加到Flash並能夠在重定向中顯示它。

您有兩種選擇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM