'Ruby/Rails button and search filtering

I've added the Active and Archived buttons to this page for extra filtering.

enter image description here

The existing search box functionality uses the following js.coffee which calls the controller index to pull the data from the db.

triggerSearch: (e) ->
    if searchCompanyTimer
      window.clearTimeout searchCompanyTimer
    searchCompanyTimer = window.setTimeout(( ->
      searchCompanyTimer = null
      query_text = $(e.currentTarget).val()
      el_id = $(e.currentTarget)[0].id
      $.get( "companies", "q[name_cont]": query_text )
      ), 500, e)

I have added 2 similar js.coffee methods which set an active flag to true or false depending on which button was pressed. Here is one of those methods.

triggerShowActive: (e) ->
    if searchCompanyTimer
      window.clearTimeout searchCompanyTimer
    searchCompanyTimer = window.setTimeout(( ->
      searchCompanyTimer = null
      $.get( '/companies', {active: true} )
      ), 500, e)

here is part of my controller.

class CompaniesController < ApplicationController

  respond_to :js, :json, :html
  $active_inactive_flag = true

  def index
    puts "params are: #{params}"
    puts "active param is: #{params[:active]}"
    puts "@active_inactive_flag pre any conditions is: #{$active_inactive_flag}"
    $active_inactive_flag = params[:active] ? params[:active] : $active_inactive_flag
    puts "@active_inactive_flag after check on params[:active] is: #{$active_inactive_flag}"
    if $active_inactive_flag.try :nonzero? 
      $active_inactive_flag = true 
    end
    puts "@active_inactive_flag after check if it has a value, else true - is: #{$active_inactive_flag}"
    @companies =
      Company.search(params[:q])
        .result
        .order('created_at DESC')
        .page(params[:page])
        .per(Settings.paginate_limit)
        .where(is_active: $active_inactive_flag)
end

here is my index.html.erb file where the buttons and search code is.

<div class="row">
        <div class="col-md-3">
            <label>Filter By:</label>
            <button class="show_active btn btn-primary" style="border-radius:10px">Active</button>
            <button class="show_inactive btn btn-primary" style="border-radius:10px">Archived   </button>
        </div>

        <div class="col-md-9">
            <div class="input-group">
                <span class="input-group-addon" id="basic-addon1">Filter by name</span>
                <input class="form-control" id="q_name_cont" name="q[name_cont]" type="text">
            </div>
        </div>
    </div>

I am using a global variable (tried instance and class variables also) in the controller but it's not working as expected. Sometimes the value in $active_inactive_flag switches from false to true or vice versa incorrectly. I don't want to use a global variable but I am at a loss as to how to combine both filter and search correctly. When the page loads we want Active button to be on by default and return active companies. The problem I am having is knowing what button was pressed when the search box is used.

Edit: Here is an example of what is happening. enter image description here Any direction would be grateful.



Solution 1:[1]

Thanks Dave,

in js.coffee added the following:

returnActiveInctiveFlag = true

and then to the triggerSearch updated to:

$.get( "companies", { "q[name_cont]": query_text, active: returnActiveInctiveFlag } )

In my new methods updated returnActiveInctiveFlag accordingly.

Was really overcomplicating it. Thanks again for getting me thinking in the correct way.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Nigel O'Connor