Skip to main content

How can I use Rails Each Array and In-page search to show/hide div content

Rails • Asked by Omar Khedr


I'm trying to set up a simple search bar to show/hide content in my rails app. Specifically, trying to allow someone to search for a specific user via username in my chatroom which are being shown using a Rails each array. I looked at these two SO questions for guidance but still didn't get it to work - https://stackoverflow.com/questions/6709718/in-page-search-using-contains-to-show-hide-div-content and https://stackoverflow.com/questions/34353009/dynamical-search-function-to-show-hide-divs. Whenever, I type a user's name though in my search box nothing appears. I have listed my code below and any help on this matter would be amazing. Thank you so much!

Index.html.erb

<div class="col-md-4">
 <form name="searchBox">
   Search for a User: <input type="text" name="keyword" />
   <input type="button" value="Search" onClick="searchFunction()" />
</form>
<% (User.all - [current_user]).each do |user| %>
<div class="box2" style="display:none" id="searchable">
            <%= image_tag user.background, height: 95, width: 165, class: "css-style4"   %>             
            <strong><%= link_to user.username, direct_message_path(user.id), data: {behavior: "chatroom-link", chatroom_id: Chatroom.direct_message_for_users([current_user, user]).id} %></strong>
</div>
<% end %>
</div>

chatroomsearch.js

function searchFunction() {
$("#searchable")
    .hide()
    .filter(":contains('" + $("input[name='keyword']").val() + "')")
    .show();
}

Hi,

You might want to check out this site too. It has a ton of guides on Rails: http://guides.rubyonrails.org/v2.3.11/form_helpers.html

Hope this helps! :)

Found the correct way that worked, leaving the code below in case anyone else needs help with it.

Index.html.erb

<div class="col-md-4">
                     <form name="searchBox" onsubmit="return searchFunction(this);">
                    Search for a User: <input type="text" name="keyword" />
                    <input type="submit" value="Search"/>
            </form>

            <div class='searchHints' style="display:none;">
              <span>No results</span>
            </div>

                <% (User.all - [current_user]).each do |user| %>
                    <div class="box2 searchable" style="display:all" data-username="<%= user.username %>">
                                <%= image_tag user.background, height: 95, width: 165, class: "css-style4"   %>
                                <div class="row">
                                <div class="col-md-4">      
                                    <%= image_tag user.avatar, height: 60, width: 55, class: "css-style5"   %>
                                </div>
                                <div class="col-md-6">
                                </div>
                                <div class="col-md-2">
                                </div>
                                </div>
                                <strong><%= link_to user.username, direct_message_path(user.id), data: {behavior: "chatroom-link", chatroom_id: Chatroom.direct_message_for_users([current_user, user]).id} %></strong>
                    </div>  
                <% end %>
                </div>

chatroomsearch.js

function searchFunction(elem) {
    var keyword, $searchableElements, $filteredElems;

    keyword = $(elem).find('input[name="keyword"]').val();
    $searchableElements = $(".searchable");

    $searchableElements.hide();
    $('.searchHints').hide();

  var $filteredElems= $searchableElements.filter(function(index, element){
    return (new RegExp(keyword, 'i')).test(element.dataset.username);
  })

  if($filteredElems.length > 0) {
    $filteredElems.show();
  } else {
    $('.searchHints').show();
  }

  return false;
}

Login or create an account to join the conversation.