2015-04-15 4 views
0

Я сохраняю электронное письмо в базе данных, а затем отправляю его. Я использую модель электронной почты для проверки входов, но я не уверен, как отображать сообщения об ошибках. Я получаю неопределенный метод `errors 'для nil: ошибка NilClass для fullmessage.errors.any? линия в действии индекса (выделено ниже)Rails 4 - Сообщения об ошибках для проверки электронной почты

Посмотреть

<%= 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 => '[email protected]', 
      :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 

ответ

0

У вас есть два варианта:.

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

Спасибо. В ответ на вариант 1 это не изменяет ошибку, которую я получаю. Возможно, потому, что @fullmessage определен в действии thank_you. (Ошибка для действия индекса) (отредактировано, чтобы показать это) Что касается варианта 2, как бы я установил ключ на основе проверки, которая не удалась в модели? –

+1

'flash [: alert] = @ fullmessage.errors.full_messages.to_sentence' – makhan

0

Nil класс означает, что @fullmessage равна нулю и не имеет и nil не имеет ошибок метода, следовательно, ошибка.

Когда вы перенаправляете, значение @fullmessage не будет иметь ничего, потому что http не имеет гражданства. Отсутствие кэширования и файлов cookie, каждая переменная воссоздается с каждым запросом. подумайте, что вы пытаетесь сделать, это отобразить флеш-сообщения, если это так, вы можете добавить @ fullmessage.errors к флеш-памяти и сможете отображать это при перенаправлении.

+0

Спасибо. Просмотрев этот [вопрос] (http://stackoverflow.com/questions/9390778/best-practice-method-of-displaying-flash-messages), я не уверен, как установить ключ для каждого флеш-сообщения на основе проверки однако это не удается в данной ситуации. Идеи? –

+0

<% flash.each do | ключ, значение | %> <% = content_tag: div, value, class: "flash # {key}"%> <% end %> – Austio

+0

Мой вопрос, вероятно, не был ясен. Я хочу спросить, как установить значения для ключей (предположительно), заданных моделью. Например, мне нужно сообщить рельсам, чтобы вывести сообщение об ошибке «Неправильный формат электронной почты», если сбой проверки не подтвержден. Таким образом, рельсы предоставили мне несколько ключей, указывающих на ошибку для поля электронной почты, и я бы установил вывод. Возможно, длинный список if ifelse? if @ fullmessage.first_name.valid -> Устанавливает значение для 'first name wrong' elseif @ fullmessage.last_name.valid? -> Установить значение «фамилия неверно»? –

Смежные вопросы