2015-06-17 3 views
0

Я пытаюсь создать модальный блок для регистрации адресов электронной почты в рельсах. Я сделал это, но не могу найти способ отображения флэш-сообщений в модальном диалоговом окне при неудачной регистрации. При отправке ящик закрывается, и сообщение появляется только на главной странице. У меня нет хороших знаний о сети или рельсах, но было бы неплохо, если бы я мог получить некоторые указатели.Отображение флэш-сообщений в модальном диалоговом окне на отправке рельсов

Функциональность работает нормально, ожидая неудачи, диалоговое окно должно отображать сообщения на нем, а не на домашней странице. Я знаю, где проблема в моем коде, но не знаю, как это сделать. Вот мой код диалоговое окно для

<div id="register" class="modal fade" role="dialog"> 
     <div class="modal-dialog"> 
     <!-- Modal content--> 
     <%= form_for(@email, url: home_esave_path, :html => {class:"model-dialog"}) do |f| %> 
     <div class="modal-content"> 
      <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal">&times;</button> 
      <h4 class="modal-title">Register</h4> 
      </div> 
      <div class="modal-body"> 
      <div class="form-group"> 
       <%= f.text_field :email, class:"form-control", placeholder: "Enter a valid gmail address" %> 
      </div> 
      <%= f.show_simple_captcha(:email=>"email", :label => "Human Authentication", :refresh_button_text => "Refresh text", class:"form-control", :placeholder => "Enter the code") %> 
      <%= f.submit "Register me!", :class => "btn register_button" %> 
      </div> 
      <div class="modal-footer" style="text-align:left"> 
      <!-- show in case of success --> 
      <% if @email.errors.any? %> 
      <div id="error_explanation"> 
       <h2> 
       <%= pluralize(@email.errors.count, "error") %> prohibited 
       this email from being saved: 
       </h2> 
       <ul> 
       <% @email.errors.full_messages.each do |msg| %> 
       <li><%= msg %></li> 
       <% end %> 
       </ul> 
      </div> 
      <% end %> 
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
      </div> 
     </div> 
     <% end %> 
     </div> 
     </div> 

мой контроллер код, чтобы получить сообщения

def save 
@email = Email.new(user_params) 
if !user_params.nil? 
    if @email.save_with_captcha 
    flash[:success] = "Success! The email address #{@email.email} has been successfully registered. We will contact you as soon as we have available rooms for new beta testers." 
    redirect_to :action => 'index' 
    else 
    if @email.valid? 
     flash[:error] = "The captcha is not correct, enter again the captcha." 
     redirect_to :action => 'index' 
    else 
     flash[:error] = "You have put invalid #{@email.email}" 
     redirect_to :action => 'index' 
    end 
    end 
end 

конец Флэш-сообщения Я отображающие вне этой модели, очевидно, что будет отображаться на главной странице. Но я не нашел способ отобразить его в диалоговом окне модели.

вот как я отображение сообщений

<% flash.each do |type, message| %> 
     <div class="alert <%= alert_for(type) %> fade in"> 
     <button class="close" data-dismiss="alert">×</button> 
     <span class="sr-only">Close</span> 
     <%= message %> 
     </div> 
     <% end %> 

Спасибо за предложения

+0

Я не уверен, что это можно сделать. Flash предназначен для отображения новой страницы. Я сделал это в одном из своих приложений с модальным с Ajax и, по существу, создав/стилизовал флеш-сообщение в моем файле просмотра .js.erb. Я могу опубликовать ответ, объясняющий этот подход немного больше, если это будет интересно. –

+0

Да, если я могу получить одобрение, этого должно быть достаточно, чтобы он работал. Даже несмотря на то, что я не очень хорош в этом языке .. но по крайней мере что-то начать – user2323

ответ

0

Вспышка предназначена как способ передачи данных между (контроллером) действиями (см documentation для получения дополнительной информации). В вашем случае вы конкретно не хотите действия, поэтому я не думаю, что есть способ сделать это.

Вы можете генерировать сообщение, похожее на другие флеш-сообщения, используя Ajax. Вот один из способов сделать это.

Вам понадобятся следующие компоненты:

Удаленный вызов от модального

Добавить remote: true или :remote => true в форму в модальном. Это сообщает Rails, что вы хотите, чтобы Ajax-вызов на сервер при отправке формы, а не на полный пост страницы.

контроллер изменяет

Вам нужно ответить на другие, чем HTML форматы. Что-то вроде этого:

def save 
    if !user_params.nil? 
    @email = Email.new(user_params) 
    @email.save_with_captcha 
    respond_to do |format| 
     format.html { redirect_to @email, notice: 'This should not happen.' } 
     format.json { render action: 'show' } 
     format.js { render action: 'show' } 
    end 
    end 
end 

Javascript для вставки/очистки «вспышки» сообщение об ошибке в вашем модальной

Посмотреть файл - show.js.erb (можно назвать по-разному, но имя должно соответствовать действие выше) ,

$('#build_error').remove(); 
<% if @email.errors.any? %> 
    var build_error = "<div class='alert alert-danger' id='build_error'>"; 
    build_error += "The form contains <%= pluralize(@email.errors.count, 'error') %>."; 
    build_error += "<ul id='error_explanation'>"; 
    <% @email.errors.full_messages.each do |msg| %> 
    build_error += "<li><%= j msg %></li>"; 
    <% end %> 
    build_error += "</ul>"; 
    build_error += "</div>"; 
    $(build_error).insertBefore("#xxxxxx"); 
<% else %> 
    $('#email-modal').modal_success(); 
<% end %> 

В принципе, вам нужно очистить все предыдущие «вспышки» сообщение об ошибке (первая строка), а затем либо отобразить новый (вам нужно найти где-нибудь в DOM, чтобы прикрепить ее - см xxxxxx) или закрыть модальный. Довольно грубая сила, но она работает для меня.

Надеюсь, вы получите эту идею. Я сомневаюсь, что все это будет работать так, как вам нужно, чтобы понять концепцию.

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