2017-02-18 14 views
0

В моем приложении RoR у меня есть таблица записей с флажком для каждой записи, чтобы пользователь мог выбирать и удалять несколько записей.Ruby on Rails: проверить, что пользователь выбрал флажок

Это работает с помощью следующего кода.

<table cellpadding="0" cellspacing="0" border="0" class="table table-striped table-bordered" id="example"> 
    <thead> 
     <tr> 
      <th></th> 
      <th>First name</th> 
      <th>Surname</th> 
      <th>Email</th> 
      <th>Subscription</th> 
      <th>Emails Received</th> 
      <th colspan=3>Available Actions</th> 
     </tr> 
    </thead> 
    <%= form_tag destroy_multiple_contacts_path, method: :delete do %> 
    <tbody> 
     <% @contacts.each do |contact| %> 
      <tr class="odd gradeX"> 
       <td><%= check_box_tag "contact_ids[]", contact.id %></td> 
       <td><%= contact.firstname %></td> 
       <td><%= contact.surname %></td> 
       <td><%= contact.email %></td> 
       <td><%= human_boolean(contact.subscription) %></td> 
       <td><%= contact.recipients.count %></td> 
       <td><%= link_to 'Show', contact_path(contact) %></td> 
       <td><%= link_to 'Edit', edit_contact_path(contact) %></td> 
       <td><%= link_to 'Destroy', contact_path(contact), method: :delete, data: { confirm: 'Are you sure?' } %></td> 
      </tr> 
     <% end %> 
    </tbody> 
</table> 

    <%= submit_tag "Delete Selected", {:class => "btn btn-danger btn-sm" } %> 
<% end %> 

Контроллер:

def destroy_multiple 
    Contact.destroy(params[:contact_ids]) 
    redirect_to contacts_path 
end 

Маршруты:

resources :contacts do 
    collection do 
    delete 'destroy_multiple' 
    end 
end 

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

Возможно ли отобразить сообщение об ошибке, если пользователь нажимает кнопку «Удалить», не выбирая флажок или разрешая удалять пользователя, если они выбрали флажок?

+0

@ KevalGohil и представлен, вероятно, самым простым и быстрым решением. вы, вероятно, можете получить fancier с java-скриптом, но я бы предложил добавить вещи в контроллер, возможно, намного проще и значительно быстрее. – BKSpurgeon

ответ

1

Вы можете использовать флэш-сообщение

в контроллере сделать

def destroy_multiple 
    if params[:contact_ids].blank? 
     flash[:notice] = "No contacts selected" 
     redirect_to :back 
    else 
     Contact.destroy(params[:contact_ids]) 
     redirect_to contacts_path 
    end 
end 

в виду добавить таблицу выше

<% if flash[:notice] %> 
    <div class="notice"><%= flash[:notice] %></div> 
<% end %> 
0

Я предлагаю несколько подходов Javascript, что весной на ум, как вы» ve помечено это сообщение javascript

  1. Отключите кнопку удаления и включите ее только после галочки. Это потребует добавления к каждому флажку eventListener, который проверяет, отмечены ли какие-либо флажки каждый раз, когда пользователь взаимодействует с флажком, а затем соответствующим образом включает/отключает кнопку.

  2. Добавить прослушиватель событий в кнопку включения. При подаче убедитесь, что по крайней мере один флажок установлен или не отправляет форму и показывается соответствующее сообщение.

Вот базовая реализация второго подхода

$(function() { 

    function noContactSelected(){ 
    var checkboxes = Array.from(document.querySelectorAll('input[type=checkbox]')); 
    var checked = checkboxes.filter(function(checkbox) { return checkbox.checked}) 
    return checked.length == 0; 
    } 

    function showNoneCheckedMsg(){ 
    var message = document.createTextNode('Please check at least one contact'); 
    document.querySelector('.error').appendChild(message); 
    } 

    $(".btn").click(function(event){ 
    if (noContactSelected()){ 
     event.preventDefault(); 
     showNoneCheckedMsg(); 
    } 
    }); 

}); 

В представлении, вам нужно будет включать ар или DIV элемент с class="error"

Это всегда рекомендуется реализовать на стороне сервера валидация, на которую отвечает ответ Кеваля Гохиля, в случае, если у пользователя нет javascript.