Я работаю над проектом с 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 в моем представлении, но они равны нулю.
Я не знаю, достаточно ли я ясен.Я положил много кода здесь.Не стесняйтесь спрашивать объяснения, если это необходимо.