2017-06-16 7 views
1

私は、より大きなプロジェクトの一部として柔軟なレポート機能を構築しています。私が苦労している特定の部分は、いくつかの呼び出しに対して完全に動作し、サーバーがクラッシュする原因となります。私はモンゴイドとプーマのサーバーを使用しています - 私が提供できる追加情報があれば教えてください。複数のjs呼び出しでクラッシュするRailsサーバー

多くの検索を行ったことがありますか?本当にこの件は困っています。前もって感謝します!それは「コントロールフレーム情報」、「その他のランタイム情報」を与えるいくつかのページに行き、「プロセスのメモリマップ」

-

コンソールのエラーメッセージ これはエラーの最初の部分のみです

/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] 

関連ページJS スクリプトは、カテゴリフィールドの値を格納し、配列に(複数選択フォーム内の)選択されたすべての列の値を押すと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のonchange JSイベントに応答ビューで 要素

<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 コントローラのアクションはJS

によって呼び出される 0 get_filter_columnsコントローラアクション

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

_filters.html.erb 部分がget_filter_columns.js.erbファイルによって

をレンダリングすることによってレンダリングされる

get_filter_columns.js.erb JSテンプレート

<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

[この記事](https://devcenter.heroku.com/articles/ruby-segfault)によると、問題はおそらく、Cの拡張機能である直接あなたまたはあなたが含ま宝石のいずれかに含まれます。そのブログの中に役立つものがあれば参照してください –

+0

こんにちはマイケル - ありがとうございます。コントローラーの動作に問題があるようです。私は、フォームのフィールドタイプを決定するブロックをコメントアウトし、問題はもう発生しません。私のコントローラーのアクションとは異なる方法でフィールド・データ・タイプを判別する方法に関する考えはありますか? –

答えて

0

問題がjsファイルを経由して立て続けに.classファイルと.instance_methodsメソッドを呼び出すことによって引き起こされているように見えました。 .classと.instance_methodsメソッドをコントローラアクションから削除して以来、問題は発生していません。

初期ページの読み込み時にネストされたハッシュをコンパイルすることで問題を解決しました(以下の形式)。その後、ハッシュはget_filter_columnsコントローラアクションに返され、ハッシュを再作成するのを避け、コントローラ内で問題のあるメソッドを呼び出す必要がありません。

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

これはエラーを助けるかもしれません、コントローラコードでこれを行うと、複数のDBヒットが連続して数回鳴らないようにします。

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 
関連する問題