У меня есть простое решение dataTables с использованием ajax-datatables-rails gem. Он отлично работает, но теперь я пытаюсь реализовать решение, в котором я могу обновить существующий dataTable на месте, с результатами отдельного действия, вызванного из пользовательской формы поиска. Существующий код, в котором действие контроллера:Обновление таблицы ajax-datatables-rails с результатами пользовательского поиска ajax
...
respond_to do |format|
format.html
ormat.json { render json: CasefileDatatable.new(view_context, {:user_id => current_user.id}) }
end
(* в настоящее время не используется user_id, только тестирование проходит в ... DataTable класс от контроллера)
с CasefileDatable:
def data
records.map do |record|
[
record.county.county_name,
record.date.strftime("%m/%d/%y"),
record.case_number,
record.primary_property_address,
record.table_json.to_s
]
end
end
...
def get_raw_records
Casefile.all
end
* последний столбец, record.table_json.to_s скрыт; содержит информацию, мне нужно в последующей обработке
Javascript:
var casefileTable = $('#casefiles-table').DataTable({
"processing": true,
"serverSide": true,
"ajax": $('#casefiles-table').data('source'),
"stateSave": false,
"pagingType": 'full_numbers',
columns: [
{data: '0'},
{data: '1'},
{data: '2'},
{data: '3'}
]
});
Это все прекрасно работает. Затем я начал добавлять пользовательскую форму поиска, так как эта модель немного более обширна и требует возможности поиска по необязательным атрибутам, для нескольких моделей с использованием объединений и т. Д. Итак, у меня есть другое действие, которое помечает этот запрос ajax из формы, а затем возвращает json, используя jbuilder, с первой попытки. Моя стратегия была использовать DataTable API, чтобы манипулировать существующий DataTable непосредственно, и я добавил соответствующие Js вызовов в моей форме на ... АЯКС: обработчик успеха, как это:
//this seems to trigger a reset/refresh, so I arrive where I started
$('#casefiles-table').dataTable().fnClearTable();
$('#casefiles-table').dataTable().fnAddData(data);
И тогда эти DataTable звонков, который ничего не сделал:
...
var dt = $('#casefiles-table').DataTable();
dt.clear().draw();
dt.rows.add(data);
dt.draw();
...
Тогда мне пришло в голову, что, возможно, я мог бы вернуться другой ... DataTable класс, и сделать все вещи запроса AR в мой контроллер, и просто передать в объекте ActiveRecord_Relation, а затем используйте это в новом, CasefileSearchDatatableClass, например:
контроллер действия возврата:
...
render json: CasefileSearchDatatable.new(view_context, {:query => finder})
end
, а затем в get_raw_records класса CasefileSearchDatatable:
def get_raw_records
results = options[:query]
# following line was just to test passing in the query via options
# p "search raw records results: #{results.size}"
results
end
Этот вид работ; запрос сработает, о чем свидетельствуют журналы sql и мои p-операторы, но таблица данных не обновляется с результатами и не очищается; остается полностью неизменным.
Итак, я пытаюсь найти наилучшее средство для обновления этой таблицы на месте, используя любой из приведенных выше методов или, при необходимости, совершенно другой подход. Кроме того, не уверен, как лучше всего обрабатывать пейджинг, предполагая, что первая цель возможна. Спасибо за любые указатели.
ах, вот почему он сбрасывается; имеет смысл. Таким образом, используя «data»: function ... approach, я все равно буду использовать одно и то же действие контроллера и переместить существующую логику поиска для извлечения параметров, где эти элементы формы указаны внутри этого блока? И тогда я мог бы принять тот же подход, когда я передаю ссылку запроса на ActiveRecord_Relation в экземпляр CasefileSearchDatatable, который я возвращаю? Думаю, это то, что вы предлагаете? Спасибо за полезный ответ; отвечает на вопрос о том, почему таблица была сброшена после, по крайней мере. – wkhatch
@wkhatch, я не специалист по Ruby, поэтому я могу сделать только общую рекомендацию. Да, вам нужно переместить логику пользовательского поиска в тот же контроллер, который обрабатывает таблицу данных и корректирует ваш запрос, когда эти параметры не пусты (добавьте дополнительные 'JOIN',' WHERE' и т. Д.). –
понял, спасибо за разъяснение, Gyrocode. Я пытаюсь понять, как, учитывая другую форму, с несколькими элементами и submit, как это могло бы инициировать это обновление внутри функции (d)? Я легко могу получить другие элементы формы val(); проблем нет, но, не совсем понимая, как я буду запускать этот блок из содержащихся форм, подайте действие? Я могу добавить слушателя в форму submit, поэтому мне интересно, есть ли какая-то функция, которую я вызываю внутри этого прослушивателя, в самом файле данных, который затем приведет к поиску/обновлению? – wkhatch