2017-06-16 2 views
1

Ich baue eine flexible Reporting-Funktion als Teil eines größeren Projekts. Das bestimmte Stück, mit dem ich kämpfe, funktioniert perfekt für mehrere Anrufe und verursacht dann den Server zum Absturz. Ich verwende Mongoid- und Puma-Server - bitte lassen Sie mich wissen, ob ich weitere Informationen zur Verfügung stellen kann.Rails Server Absturz mit mehreren Js Calls

Haben eine ganze Menge suchen - wirklich ratlos auf diesem. Vielen Dank im Voraus!

Console Fehlermeldung Dies ist nur der erste Teil des Fehlers - es auf mehreren Seiten geht „Control Frame-Information“, „Andere Laufzeitinformationen“ und die „Prozessspeicherkarte“

geben
/usr/local/rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/forwardable.rb:228: [BUG] Segmentation fault at 0x00000000000038 
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux] 

relevante Webseiten js Skript speichert Wert des Kategoriefeldes und schiebt alle Spaltenwerte ausgewählt (innerhalb einer Mehrfachauswahl-Form) in eine Anordnung und sendet beide Variablen an die Controller-Aktion get_filter_columns

<script> 
    $(document).ready(function(){ 
     function get_filter_columns(filter_columns, category){ 
      $.get('reports/get_filter_columns',{filter_columns, category}); 
     }; 

     $(document).on('change', "#filter_columns", function() { 
      var filter_column_array = []; 
      var category = $("#report_category").val(); 
      $("#filter_columns .box2 option").each(function() { 

       filter_column_array.push($(this).val()); 
      }); 
      get_filter_columns(filter_column_array, category); 
     }); 
    }); 
</script> 

_filter_columns.html.erb Element in Ansicht, die auf die Onchange js Ereignis reagiert

<div id = "filter_columns" class="col-lg-5"> 
    <div class = "ibox-content report_builder_body"> 
     <h2>Filter Columns</h2> 
     <%= simple_fields_for :filter_columns_nested_form do |ff| %> 
      <%= ff.select(:filter_columns, (@category || Account).attribute_names.map{ |value| [value.to_s.underscore.humanize, value] }, {}, { :id => "filter_columns", :class => "form-control dual_select_filter_columns", :multiple => true }) %> 
     <% end %> 
    </div> 
</div> 

reports_controller.rb Reglerwirkung von JS aufgerufen wird

def get_filter_columns 

     @category = (params[:category] || "Account").split(' ').collect(&:capitalize).join.constantize 

     @filter_categories = (params[:filter_columns] || []).map{ |filter| filter } 

     @filter_symbols = {} 

     @filter_logic = ["Equal to", "Not equal to", "Less than", "Less than or equal to", "Greater than", "Greater than or equal to", "Is between", "Is not between"] 

     @filter_categories.each do |fs| 
      if @category.instance_methods(false).include?(fs.to_s.to_sym) == true 
      @filter_symbols[fs] = "enum" 
      elsif @category.pluck(fs.to_s.to_sym)[0].class.to_s == "BSON::ObjectId" 
      @filter_symbols[fs] = "string" 
      elsif @category.pluck(fs.to_s.to_sym)[0].class.to_s == "NilClass" 
      @filter_symbols[fs] = "string" 
      elsif @category.pluck(fs.to_s.to_sym)[0].class.to_s == "Time" 
      @filter_symbols[fs] = "date" 
      else 
      @filter_symbols[fs] = @category.pluck(fs.to_s.to_sym)[0].class.to_s || "string" 
      end 
     end 

     render "reports/js_templates/get_filter_columns.js.erb" 
    end 

get_filter_columns.js.erb js Schablone von get_filter_columns Controller-Aktion

$('#filters').replaceWith('<%= j render("reports/partials/filters") %>'); 

gerenderten _filters.html.erb Teil durch get_filter_columns.js.erb Datei gerendert

<div class="col-lg-7" id = "filters"> 
    <div class = "ibox-content report_builder_body"> 
     <h2>Filter Criteria</h2> 
     <div class="scroll_content"> 
      <% if @filter_categories.nil? || @filter_categories.size == 0 %> 
       <p> No filter columns have been selected! </p> 
      <% else %> 
       <%= simple_fields_for :filters_nested_form do |ff| %> 
        <% (@filter_categories || []).each do |filter| %> 
         <div class = "col-lg-3"> 
          <h5> 
           <%= filter.to_s.underscore.humanize %>: 
          </h5>  
         </div> 
         <%= ff.simple_fields_for :"#{filter}" do |fff| %> 
          <div class = "col-lg-5"> 
           <%= fff.input :logic, collection: @filter_logic, label: false %> 
          </div> 
          <div class = "col-lg-4"> 
           <%= fff.input :criteria, as: :"#{@filter_symbols[filter].to_s.downcase}", label: false %> 
          </div> 
         <% end %>  
        <% end %> 
       <% end %> 
      <% end %> 
     </div> 
    </div>  
</div> 
+0

nach [dieser Artikel] (https://devcenter.heroku.com/articles/ruby-segfault) das Problem liegt wahrscheinlich in C-Erweiterungen enthalten entweder direkt von Ihnen oder in einem Gem Sie enthalten.Sehen Sie, ob etwas in diesem Blog hilfreich ist –

+0

Hallo Michael - Vielen Dank für Ihre Antwort. Es scheint ein Problem mit der Controller-Aktion zu sein. Ich habe den Block, der die Formularfeldertypen bestimmt, auskommentiert und das Problem tritt nicht mehr auf. Irgendwelche Gedanken darüber, wie Sie einen Felddatentyp anders als bei meiner Controller-Aktion ermitteln können? –

Antwort

0

Die Frage schien durch den Aufruf der .class- und .instance_methods Methoden in schneller Folge über js verursacht wurden. Ich habe die Methoden .class und .instance_methods aus der Controller-Aktion entfernt und seitdem kein Problem mehr.

Ich löste das Problem durch Kompilieren eines verschachtelten Hash beim ersten Laden der Seite (Format unten gezeigt). Der Hash wird dann an die get_filter_columns-Controller-Aktion zurückgegeben, um zu vermeiden, dass der Hash neu erstellt wird und die problematischen Methoden innerhalb des Controllers aufgerufen werden müssen.

column_symbols = { model_1_name: { column_1_name: data_type, column_2_name: data_type }, model_2_name: { column_1_name: data_type, column_2_name: data_type }..... } 
0

Dies kann helfen, den Fehler, in der Controller-Code dies tun, wird es zumindest verhindern, dass mehrere DB-Hits mehrmals in Folge reißen.

ClassOverrideList = { 
    "BSON::ObjectId" => "string", 
    "NilClass" => "string", 
    "Time" => "date"   
} 

def get_filter_columns 

    @category = (params[:category] || "Account").split(' ').collect(&:capitalize).join.constantize 

    @filter_categories = (params[:filter_columns] || []).map{ |filter| filter } 

    @filter_symbols = {} 

    @filter_logic = ["Equal to", "Not equal to", "Less than", "Less than or equal to", "Greater than", "Greater than or equal to", "Is between", "Is not between"] 

    @filter_categories.each do |fs| 
     fs_sym = fs.to_s.to_sym 
     if @category.instance_methods(false).include?(fs.to_s.to_sym) == true 
     @filter_symbols[fs] = "enum" 
     else 
     category_class = @category.pluck(fs_sym)[0].class.to_s 
     @filter_symbols[fs] = ClassOverrideList[category_class] || 
      category_class || 
      "string" 
     end 
    end 

    render "reports/js_templates/get_filter_columns.js.erb" 
end