Как перезагрузить переменные экземпляра после вызова ajax в ruby ​​на рельсах - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю над проектом с Ruby на рельсах.В настоящее время у меня есть некоторые проблемы с моей страницей индекса, на которой я использую Datatables для отображения моих данных.Я использую серверную опцию для отображения моих данных, так как это очень большая база данных.Я добавил селектор, чтобы позволить пользователю выбрать проект, уязвимости которого он хочет видеть.Мне удалось получить проект в моем контроллере, и я передал его в переменной экземпляра, потому что он мне нужен.Однако переменная не перезагружается с помощью вызова ajax.Как я могу перезагрузить переменные экземпляра в моем представлении?Мне нужен не только проект, но и другие переменные, такие как отображаемые переменные, чтобы строить графики в зависимости от критики ... Возможно, я делаю это неправильно.Не могли бы вы помочь мне ?Ниже приведен мой код.

Просмотр:

<div class="col-md-8 col-xs-8" style="display: inline-block">
  <div class="x_panel">
    <h4>Filtres</h4>
    <div class="x_content">
      <div class="col-md-6 col-xs-6" style="display: inline-block">
        <label>Filter by projet : </label>
        <%= select_tag "datatable_project", options_from_collection_for_select(@user.projects, :id, :name), include_blank: "Tous", onchange: "selectProject(this.value)" %>
      </div>
    </div>
  </div>
</div>
<div class="x_panel">
  <table id="datatable-history-external" class="table responsive-utilities mcs-datatable-history-external" width="100%">
    <thead>
      <tr class="headings">
        <th class="column-title all" style="width:150px">CVE</th>
        <th class="column-title all">Base score</th>
        <% if not @selected_project.nil? and @selected_project.level == 2 %>
          <th class="column-title all">Environmental score</th>
        <% else %>
          <th class="column-title never"></th>
        <% end %>
        <th class="column-title none">Description</th>
      </tr>
    </thead>
  </table>
</div>

Я хочу отобразить новый столбец, если уровень выбранного проекта равен 2. Я пытался изменить класс из JavaScript, но этоне работал, так как я использую адаптивный для отображения childRow.

Контроллер:

def pagination
  # Recuperation of the DataTable parameters
  draw = params[:draw]
  longueur = params[:length]
  start = params[:start]

  # Call method from model to get validated vulnerabilities
  vulnerability_ids = []
  #get project selection from the user
  selected_project_id = get_selection
  if not selected_project_id.blank?
    @selected_project = Project.find(selected_project_id)
    vulnerability_ids = @selected_project.validated_vulnerabilities.pluck(:id)
  else
    @user.projects.each {|project| vulnerability_ids += project.validated_vulnerabilities.pluck(:id)}
  end
  vulnerability_ids = vulnerability_ids.uniq
  @vulnerabilities = Vulnerability.where(id: vulnerability_ids)

  result = []

  result = @vulnerabilities.offset(start.to_i).limit(longueur.to_i)
  recordsTotal = @vulnerabilities.length

  # creation of the json that we want to return and display
  result_json = create_datatable_json(result, draw, recordsTotal)

  render :json =>result_json.to_json
 end

Помощник контроллера:

def get_selections
  parameters = request.query_parameters
  selected_project = parameters["project"]

  return selected_project
end

def create_datatable_json(result, draw, recordsTotal)
  vulns = []
  result.each do |vul|
    cves = []

    #if there is a selected project and it is of level 2 we want to display a column with the max environmental notation
    if @selected_project.nil? or not @selected_project.analysis_level == 2
      max_environmental_score = "NC"
    else
      max_environmental_notation = EnvironmentalNotation.get_max_environmental_notation(vul, @selected_project).environmental_score
    end

    if vul.notation
      vuln = [:id => vul.id, :cve => first_cves, :base_score => vul.notation.base_score.to_s, :description => vul.description, :environmental_score => max_environmental_score.to_s]
    else
      vuln = [:id => vul.id, :cve => first_cves, :base_score => "NC", :description => vul.description, :environmental_score => max_environmental_score.to_s]
    end

    vulns += vuln
  end
  result_json = {
    :draw => draw,
    :recordsTotal => recordsTotal,
    :recordsFiltered => recordsTotal,
    :data => vulns
  }
  return result_json

end

Javascript:

// Select project to filter the vulnerabilities to display in table
function selectProject(value) {
    project = value;
    Turbolinks.visit(window.location); 
}

$(document).on("turbolinks:load", function() {
    $('.mcs-datatable-history-external').each(function() {
        if ($.fn.dataTable.isDataTable($(this))){
            $(this).destroy();
        }
        var url = "vulnerabilities/pagination;
        if (project != null) {
            url = url+"/?project="+project;
            $('#datatable_project').val(project);
        }

        add_in_array(
            $(this).DataTable({
                processing: true,
                serverSide: true,
                stateSave: true,
                responsive: {
                details: {
                    display: $.fn.dataTable.Responsive.display.childRowImmediate,
                    type: '',
                    target: 3
                }
            },
            ajax: {
                type: "POST",
                format: "js",
                url: url
            },
            columns: [
                { data: "cve", targets:0},
                {  data: "base_score", targets:1, orderable: true, searchable: true},
                {  data: "environmental_score", targets:2, orderable: true, searchable: false},        
                {  data: "description", className: "no-border-top", targets:3, orderable: false, searchable: true},
            ],
            searching: true,
        }));
    })
}

Мне нужно получить @selected_project и @vulnerabilities в моем представлении, но они равны нулю.

Я не знаю, достаточно ли я ясен.Я положил много кода здесь.Не стесняйтесь спрашивать объяснения, если это необходимо.

1 Ответ

0 голосов
/ 24 сентября 2018

сначала убедитесь, что изменения будут сохранены в базе данных позже, если экземпляр не будет перезагружен, тогда вы можете использовать

@instance_variable.reload!

Для перезагрузки экземпляра

Вы можете использовать его всякий раз, когда вынеобходимо отобразить / использовать обновленные данные экземпляра.Скажем, есть экземпляр @user, и вы обновили информацию о пользователе, например @ user.email, в БД, и позже вам нужно отобразить электронную почту пользователя, используя этот экземпляр, например @ user.email.В этом случае экземпляр не будет перезагружен и будет отображать предыдущее значение.

Так что если вы используете @ user.reload!тогда rails будет извлекать детали этого экземпляра из DB.так что будет меньше места для ошибки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...