转换 Javascript 数据表以在 Rails 应用程序中使用 Opal
Converting Javascript datatables to use Opal in Rails app
我正在使用ajax-datatables-rails。下面是我的数据表的 JS。我想将 javascript 转换为等效的 Opal.rb。
jQuery(document).ready(function() {
var table = $('#organizations-datatable');
var token = $('meta[name=csrf-token]').attr('content');
table.DataTable({
"processing": true,
"serverSide": true,
"ajax": {
"url": "/organizations/datatable.json",
"type": 'POST',
"beforeSend": function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', token)
}
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
],
"iDisplayLength": 25
});
});
它包括将 CSRF 令牌添加到 ajax 数据请求。
我希望我们所有的 javascript 都写成蛋白石以便于阅读等。请不要争论这个选择,我只关心如何通过 [=36 使它作为 Opalrb 工作=]
下面的Opal没有和上面的JS实现一样。谁能帮我理解为什么?
Element.expose :DataTable
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"processing": true,
"serverSide": true,
"ajax": {
"url": "/organizations/datatable.json",
"type": 'POST',
"beforeSend": lambda do
xhr = `new window.XMLHttpRequest()`
xhr.setRequestHeader('X-CSRF-Token', token)
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
]
}
Element['#organizations-datatable'].DataTable(settings.to_n)
end
我在这里错过了什么?为什么这个蛋白石不好?
编辑:这是我的路线,这确保 POST 适用于此:
Rails.application.routes.draw do
concern :with_datatable do
post 'datatable', on: :collection
end
resources :organizations, concerns: [:with_datatable]
end
这是我使用 gem:
的相关控制器和数据表代码
class OrganizationsController < ApplicationController
def index
@title = "Organizations"
@page_description = "Organization data warehouse"
@page_icon = "institution"
@organization = Organization.new
@load = {data_table: true}
@menu = Menu.new
respond_to do |format|
format.html
format.json { render json: OrganizationDatatable.new(params) }
end
end
def datatable
logger.ap "datatable params: #{params}"
respond_to do |format|
format.json { render json: OrganizationDatatable.new(params) }
end
end
def get_raw_records
Organization.all
end
def create
end
def edit
end
def destroy
end
def show
end
def update
end
def new
end
end
这是数据表
class OrganizationDatatable < AjaxDatatablesRails::ActiveRecord
extend Forwardable
include ActionView::Helpers::TextHelper
def_delegator :@view, :link_to
def view_columns
# Declare strings in this format: ModelName.column_name
# or in aliased_join_table.column_name format
@view_columns ||= {
# id: { source: "Organization.id" },
name: { source: "Organization.name",cond: :like, searchable: true, orderable: true },
desc: { source: "Organization.description",cond: :like, searchable: true, orderable: true },
industry: { source: "Organization.industry",cond: :like, searchable: true, orderable: true },
tags: { source: "Organization.tag_list", searchable: false, orderable: false }
}
end
def data
records.map do |record|
{
id: record.id,
name: record.name,
desc: truncate(record.description,length: 240, separator: ' '),
industry: record.industry,
tags: record.decorate.buttonize_tags,
DT_RowId: record.id
}
end
end
def get_raw_records
Organization.all
end
end
我将从指出您代码中的一些错误开始,
beforeSend中的代码有问题请参考supplying-an-xhr-method,改成下面的代码,
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
像上面的语句一样,用 (`) 反引号将 xhr 语句括起来
列应该有二维数组而不是对象数组,
"columns": [
["data": "name"],
["data": "desc"],
["data": "industry"],
["data": "tags"]
]
其余代码看起来不错。
下面是测试代码,
Element.expose :DataTable
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"ajax": {
"url": "/data.json",
"type": 'POST',
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
["data": "Name"],
["data": "Position"],
["data": "Office"],
["data": "Extn."],
["data": "Start"],
["data": "Salary"]
]
}
Element['#organizations-datatable'].DataTable(settings.to_n)
end
确保rails应用程序的public文件夹中有data.json
文件,内容如下,
{
"data": [
[
"Tiger Nixon",
"System Architect",
"Edinburgh",
"5421",
"2011/04/25",
"0,800"
],
[
"Garrett Winters",
"Accountant",
"Tokyo",
"8422",
"2011/07/25",
"0,750"
],
[
"Ashton Cox",
"Junior Technical Author",
"San Francisco",
"1562",
"2009/01/12",
",000"
],
[
"Cedric Kelly",
"Senior Javascript Developer",
"Edinburgh",
"6224",
"2012/03/29",
"3,060"
],
[
"Airi Satou",
"Accountant",
"Tokyo",
"5407",
"2008/11/28",
"2,700"
],
[
"Brielle Williamson",
"Integration Specialist",
"New York",
"4804",
"2012/12/02",
"2,000"
],
[
"Herrod Chandler",
"Sales Assistant",
"San Francisco",
"9608",
"2012/08/06",
"7,500"
],
[
"Rhona Davidson",
"Integration Specialist",
"Tokyo",
"6200",
"2010/10/14",
"7,900"
],
[
"Colleen Hurst",
"Javascript Developer",
"San Francisco",
"2360",
"2009/09/15",
"5,500"
],
[
"Sonya Frost",
"Software Engineer",
"Edinburgh",
"1667",
"2008/12/13",
"3,600"
],
[
"Jena Gaines",
"Office Manager",
"London",
"3814",
"2008/12/19",
",560"
],
[
"Quinn Flynn",
"Support Lead",
"Edinburgh",
"9497",
"2013/03/03",
"2,000"
],
[
"Charde Marshall",
"Regional Director",
"San Francisco",
"6741",
"2008/10/16",
"0,600"
],
[
"Haley Kennedy",
"Senior Marketing Designer",
"London",
"3597",
"2012/12/18",
"3,500"
],
[
"Tatyana Fitzpatrick",
"Regional Director",
"London",
"1965",
"2010/03/17",
"5,750"
],
[
"Michael Silva",
"Marketing Designer",
"London",
"1581",
"2012/11/27",
"8,500"
],
[
"Paul Byrd",
"Chief Financial Officer (CFO)",
"New York",
"3059",
"2010/06/09",
"5,000"
],
[
"Gloria Little",
"Systems Administrator",
"New York",
"1721",
"2009/04/10",
"7,500"
],
[
"Bradley Greer",
"Software Engineer",
"London",
"2558",
"2012/10/13",
"2,000"
],
[
"Dai Rios",
"Personnel Lead",
"Edinburgh",
"2290",
"2012/09/26",
"7,500"
],
[
"Jenette Caldwell",
"Development Lead",
"New York",
"1937",
"2011/09/03",
"5,000"
],
[
"Yuri Berry",
"Chief Marketing Officer (CMO)",
"New York",
"6154",
"2009/06/25",
"5,000"
],
[
"Caesar Vance",
"Pre-Sales Support",
"New York",
"8330",
"2011/12/12",
"6,450"
],
[
"Doris Wilder",
"Sales Assistant",
"Sidney",
"3023",
"2010/09/20",
",600"
],
[
"Angelica Ramos",
"Chief Executive Officer (CEO)",
"London",
"5797",
"2009/10/09",
",200,000"
],
[
"Gavin Joyce",
"Developer",
"Edinburgh",
"8822",
"2010/12/22",
",575"
],
[
"Jennifer Chang",
"Regional Director",
"Singapore",
"9239",
"2010/11/14",
"7,650"
],
[
"Brenden Wagner",
"Software Engineer",
"San Francisco",
"1314",
"2011/06/07",
"6,850"
],
[
"Fiona Green",
"Chief Operating Officer (COO)",
"San Francisco",
"2947",
"2010/03/11",
"0,000"
],
[
"Shou Itou",
"Regional Marketing",
"Tokyo",
"8899",
"2011/08/14",
"3,000"
],
[
"Michelle House",
"Integration Specialist",
"Sidney",
"2769",
"2011/06/02",
",400"
],
[
"Suki Burks",
"Developer",
"London",
"6832",
"2009/10/22",
"4,500"
],
[
"Prescott Bartlett",
"Technical Author",
"London",
"3606",
"2011/05/07",
"5,000"
],
[
"Gavin Cortez",
"Team Leader",
"San Francisco",
"2860",
"2008/10/26",
"5,500"
],
[
"Martena Mccray",
"Post-Sales support",
"Edinburgh",
"8240",
"2011/03/09",
"4,050"
],
[
"Unity Butler",
"Marketing Designer",
"San Francisco",
"5384",
"2009/12/09",
",675"
],
[
"Howard Hatfield",
"Office Manager",
"San Francisco",
"7031",
"2008/12/16",
"4,500"
],
[
"Hope Fuentes",
"Secretary",
"San Francisco",
"6318",
"2010/02/12",
"9,850"
],
[
"Vivian Harrell",
"Financial Controller",
"San Francisco",
"9422",
"2009/02/14",
"2,500"
],
[
"Timothy Mooney",
"Office Manager",
"London",
"7580",
"2008/12/11",
"6,200"
],
[
"Jackson Bradshaw",
"Director",
"New York",
"1042",
"2008/09/26",
"5,750"
],
[
"Olivia Liang",
"Support Engineer",
"Singapore",
"2120",
"2011/02/03",
"4,500"
],
[
"Bruno Nash",
"Software Engineer",
"London",
"6222",
"2011/05/03",
"3,500"
],
[
"Sakura Yamamoto",
"Support Engineer",
"Tokyo",
"9383",
"2009/08/19",
"9,575"
],
[
"Thor Walton",
"Developer",
"New York",
"8327",
"2013/08/11",
",540"
],
[
"Finn Camacho",
"Support Engineer",
"San Francisco",
"2927",
"2009/07/07",
",500"
],
[
"Serge Baldwin",
"Data Coordinator",
"Singapore",
"8352",
"2012/04/09",
"8,575"
],
[
"Zenaida Frank",
"Software Engineer",
"New York",
"7439",
"2010/01/04",
"5,250"
],
[
"Zorita Serrano",
"Software Engineer",
"San Francisco",
"4389",
"2012/06/01",
"5,000"
],
[
"Jennifer Acosta",
"Junior Javascript Developer",
"Edinburgh",
"3431",
"2013/02/01",
",650"
],
[
"Cara Stevens",
"Sales Assistant",
"New York",
"3990",
"2011/12/06",
"5,600"
],
[
"Hermione Butler",
"Regional Director",
"London",
"1016",
"2011/03/21",
"6,250"
],
[
"Lael Greer",
"Systems Administrator",
"London",
"6733",
"2009/02/27",
"3,500"
],
[
"Jonas Alexander",
"Developer",
"San Francisco",
"8196",
"2010/07/14",
",500"
],
[
"Shad Decker",
"Regional Director",
"Edinburgh",
"6373",
"2008/11/13",
"3,000"
],
[
"Michael Bruce",
"Javascript Developer",
"Singapore",
"5384",
"2011/06/27",
"3,000"
],
[
"Donna Snider",
"Customer Support",
"New York",
"4226",
"2011/01/25",
"2,000"
]
]
}
将 opal
添加到 Gemfile
,
gem 'opal-rails'
gem 'opal-jquery'
application.js.rb
内容,
require 'opal'
require 'jquery'
require 'opal-jquery'
require 'datatables.min'
require_tree '.'
将 datatables.min.js
文件添加到 app/assets/javascripts
文件夹
html,
<table id="organizations-datatable" class="display" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
</table>
注意 :- 如果你想让它与 POST 一起工作,你必须调整你的 config/routes.rb
,
在 routes.rb 中为您的 json 文件添加以下条目,
对我来说,
post '/data.json', :to => redirect('/data.json')
对你来说,
post '/organizations/datatable.json', :to => redirect('/organizations/datatable.json')
完整代码在这里 https://gitlab.com/shoyebsheikh/opal-datatables
Ajax数据tables railsgem解决方案:
假设这是数据源,您可以将以下行添加到您的路线中,
post '/organizations/datatable.json', :to => redirect('/organizations/datatable.json')
你的控制器应该是这样的,
class OrganizationsController < ApplicationController
def datatable
params["columns"] ||= { "0" => {"data" => "" } }
params["length"] ||= -1
respond_to do |format|
format.html
format.json { render json: OrganizationDatatable.new(params) }
end
end
end
而你的数据table如下,
class OrganizationDatatable < AjaxDatatablesRails::ActiveRecord
def view_columns
# Declare strings in this format: ModelName.column_name
# or in aliased_join_table.column_name format
@view_columns ||= {
# id: { source: "Organization.id" },
name: { source: "Organization.name",cond: :like, searchable: true, orderable: true },
desc: { source: "Organization.description",cond: :like, searchable: true, orderable: true },
industry: { source: "Organization.industry",cond: :like, searchable: true, orderable: true },
tags: { source: "Organization.tag_list", searchable: false, orderable: false }
}
end
def data
records.map do |record|
{
# id: record.id,
name: record.name,
desc: truncate(record.description,length: 240, separator: ' '),
industry: record.industry,
tags: record.decorate.buttonize_tags,
DT_RowId: record.id
}
end
end
def get_raw_records
Organization.all
end
end
在您的 organizations.js.rb
中输入蛋白石代码,
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"ajax": {
"url": Element['#organizations-datatable'].data('source'),
"type": 'POST',
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
]
}
Element['#organizations-datatable'].dataTable(settings.to_n)
end
并且在html,
<table id="organizations-datatable" data-source="<%= organizations_index_path(format: :json) %>">
<thead>
<tr>
<th>Name</th>
<th>Desc</th>
<th>Industry</th>
<th>tags</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
organizations_index_path
可以是 organizations_path
或像 organization_index_path
或 organization_path
这样的单数形式,具体取决于您的控制器名称
详情请参考https://gitlab.com/shoyebsheikh/ajax-datatables-rails-with-opal
注:
- 已使用 mysql2 gem。
- 运行 迁移并将条目添加到 table 来自
rails CLI 或在 table.
中手动
- 如果你运行安装所有依赖项和运行迁移后的项目,请访问http://localhost:3000/user/index or http://localhost:3000/hello_world/index
我正在使用ajax-datatables-rails。下面是我的数据表的 JS。我想将 javascript 转换为等效的 Opal.rb。
jQuery(document).ready(function() {
var table = $('#organizations-datatable');
var token = $('meta[name=csrf-token]').attr('content');
table.DataTable({
"processing": true,
"serverSide": true,
"ajax": {
"url": "/organizations/datatable.json",
"type": 'POST',
"beforeSend": function (xhr) {
xhr.setRequestHeader('X-CSRF-Token', token)
}
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
],
"iDisplayLength": 25
});
});
它包括将 CSRF 令牌添加到 ajax 数据请求。
我希望我们所有的 javascript 都写成蛋白石以便于阅读等。请不要争论这个选择,我只关心如何通过 [=36 使它作为 Opalrb 工作=]
下面的Opal没有和上面的JS实现一样。谁能帮我理解为什么?
Element.expose :DataTable
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"processing": true,
"serverSide": true,
"ajax": {
"url": "/organizations/datatable.json",
"type": 'POST',
"beforeSend": lambda do
xhr = `new window.XMLHttpRequest()`
xhr.setRequestHeader('X-CSRF-Token', token)
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
]
}
Element['#organizations-datatable'].DataTable(settings.to_n)
end
我在这里错过了什么?为什么这个蛋白石不好?
编辑:这是我的路线,这确保 POST 适用于此:
Rails.application.routes.draw do
concern :with_datatable do
post 'datatable', on: :collection
end
resources :organizations, concerns: [:with_datatable]
end
这是我使用 gem:
的相关控制器和数据表代码class OrganizationsController < ApplicationController
def index
@title = "Organizations"
@page_description = "Organization data warehouse"
@page_icon = "institution"
@organization = Organization.new
@load = {data_table: true}
@menu = Menu.new
respond_to do |format|
format.html
format.json { render json: OrganizationDatatable.new(params) }
end
end
def datatable
logger.ap "datatable params: #{params}"
respond_to do |format|
format.json { render json: OrganizationDatatable.new(params) }
end
end
def get_raw_records
Organization.all
end
def create
end
def edit
end
def destroy
end
def show
end
def update
end
def new
end
end
这是数据表
class OrganizationDatatable < AjaxDatatablesRails::ActiveRecord
extend Forwardable
include ActionView::Helpers::TextHelper
def_delegator :@view, :link_to
def view_columns
# Declare strings in this format: ModelName.column_name
# or in aliased_join_table.column_name format
@view_columns ||= {
# id: { source: "Organization.id" },
name: { source: "Organization.name",cond: :like, searchable: true, orderable: true },
desc: { source: "Organization.description",cond: :like, searchable: true, orderable: true },
industry: { source: "Organization.industry",cond: :like, searchable: true, orderable: true },
tags: { source: "Organization.tag_list", searchable: false, orderable: false }
}
end
def data
records.map do |record|
{
id: record.id,
name: record.name,
desc: truncate(record.description,length: 240, separator: ' '),
industry: record.industry,
tags: record.decorate.buttonize_tags,
DT_RowId: record.id
}
end
end
def get_raw_records
Organization.all
end
end
我将从指出您代码中的一些错误开始,
beforeSend中的代码有问题请参考supplying-an-xhr-method,改成下面的代码,
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
像上面的语句一样,用 (`) 反引号将 xhr 语句括起来
列应该有二维数组而不是对象数组,
"columns": [ ["data": "name"], ["data": "desc"], ["data": "industry"], ["data": "tags"] ]
其余代码看起来不错。
下面是测试代码,
Element.expose :DataTable
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"ajax": {
"url": "/data.json",
"type": 'POST',
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
["data": "Name"],
["data": "Position"],
["data": "Office"],
["data": "Extn."],
["data": "Start"],
["data": "Salary"]
]
}
Element['#organizations-datatable'].DataTable(settings.to_n)
end
确保rails应用程序的public文件夹中有data.json
文件,内容如下,
{
"data": [
[
"Tiger Nixon",
"System Architect",
"Edinburgh",
"5421",
"2011/04/25",
"0,800"
],
[
"Garrett Winters",
"Accountant",
"Tokyo",
"8422",
"2011/07/25",
"0,750"
],
[
"Ashton Cox",
"Junior Technical Author",
"San Francisco",
"1562",
"2009/01/12",
",000"
],
[
"Cedric Kelly",
"Senior Javascript Developer",
"Edinburgh",
"6224",
"2012/03/29",
"3,060"
],
[
"Airi Satou",
"Accountant",
"Tokyo",
"5407",
"2008/11/28",
"2,700"
],
[
"Brielle Williamson",
"Integration Specialist",
"New York",
"4804",
"2012/12/02",
"2,000"
],
[
"Herrod Chandler",
"Sales Assistant",
"San Francisco",
"9608",
"2012/08/06",
"7,500"
],
[
"Rhona Davidson",
"Integration Specialist",
"Tokyo",
"6200",
"2010/10/14",
"7,900"
],
[
"Colleen Hurst",
"Javascript Developer",
"San Francisco",
"2360",
"2009/09/15",
"5,500"
],
[
"Sonya Frost",
"Software Engineer",
"Edinburgh",
"1667",
"2008/12/13",
"3,600"
],
[
"Jena Gaines",
"Office Manager",
"London",
"3814",
"2008/12/19",
",560"
],
[
"Quinn Flynn",
"Support Lead",
"Edinburgh",
"9497",
"2013/03/03",
"2,000"
],
[
"Charde Marshall",
"Regional Director",
"San Francisco",
"6741",
"2008/10/16",
"0,600"
],
[
"Haley Kennedy",
"Senior Marketing Designer",
"London",
"3597",
"2012/12/18",
"3,500"
],
[
"Tatyana Fitzpatrick",
"Regional Director",
"London",
"1965",
"2010/03/17",
"5,750"
],
[
"Michael Silva",
"Marketing Designer",
"London",
"1581",
"2012/11/27",
"8,500"
],
[
"Paul Byrd",
"Chief Financial Officer (CFO)",
"New York",
"3059",
"2010/06/09",
"5,000"
],
[
"Gloria Little",
"Systems Administrator",
"New York",
"1721",
"2009/04/10",
"7,500"
],
[
"Bradley Greer",
"Software Engineer",
"London",
"2558",
"2012/10/13",
"2,000"
],
[
"Dai Rios",
"Personnel Lead",
"Edinburgh",
"2290",
"2012/09/26",
"7,500"
],
[
"Jenette Caldwell",
"Development Lead",
"New York",
"1937",
"2011/09/03",
"5,000"
],
[
"Yuri Berry",
"Chief Marketing Officer (CMO)",
"New York",
"6154",
"2009/06/25",
"5,000"
],
[
"Caesar Vance",
"Pre-Sales Support",
"New York",
"8330",
"2011/12/12",
"6,450"
],
[
"Doris Wilder",
"Sales Assistant",
"Sidney",
"3023",
"2010/09/20",
",600"
],
[
"Angelica Ramos",
"Chief Executive Officer (CEO)",
"London",
"5797",
"2009/10/09",
",200,000"
],
[
"Gavin Joyce",
"Developer",
"Edinburgh",
"8822",
"2010/12/22",
",575"
],
[
"Jennifer Chang",
"Regional Director",
"Singapore",
"9239",
"2010/11/14",
"7,650"
],
[
"Brenden Wagner",
"Software Engineer",
"San Francisco",
"1314",
"2011/06/07",
"6,850"
],
[
"Fiona Green",
"Chief Operating Officer (COO)",
"San Francisco",
"2947",
"2010/03/11",
"0,000"
],
[
"Shou Itou",
"Regional Marketing",
"Tokyo",
"8899",
"2011/08/14",
"3,000"
],
[
"Michelle House",
"Integration Specialist",
"Sidney",
"2769",
"2011/06/02",
",400"
],
[
"Suki Burks",
"Developer",
"London",
"6832",
"2009/10/22",
"4,500"
],
[
"Prescott Bartlett",
"Technical Author",
"London",
"3606",
"2011/05/07",
"5,000"
],
[
"Gavin Cortez",
"Team Leader",
"San Francisco",
"2860",
"2008/10/26",
"5,500"
],
[
"Martena Mccray",
"Post-Sales support",
"Edinburgh",
"8240",
"2011/03/09",
"4,050"
],
[
"Unity Butler",
"Marketing Designer",
"San Francisco",
"5384",
"2009/12/09",
",675"
],
[
"Howard Hatfield",
"Office Manager",
"San Francisco",
"7031",
"2008/12/16",
"4,500"
],
[
"Hope Fuentes",
"Secretary",
"San Francisco",
"6318",
"2010/02/12",
"9,850"
],
[
"Vivian Harrell",
"Financial Controller",
"San Francisco",
"9422",
"2009/02/14",
"2,500"
],
[
"Timothy Mooney",
"Office Manager",
"London",
"7580",
"2008/12/11",
"6,200"
],
[
"Jackson Bradshaw",
"Director",
"New York",
"1042",
"2008/09/26",
"5,750"
],
[
"Olivia Liang",
"Support Engineer",
"Singapore",
"2120",
"2011/02/03",
"4,500"
],
[
"Bruno Nash",
"Software Engineer",
"London",
"6222",
"2011/05/03",
"3,500"
],
[
"Sakura Yamamoto",
"Support Engineer",
"Tokyo",
"9383",
"2009/08/19",
"9,575"
],
[
"Thor Walton",
"Developer",
"New York",
"8327",
"2013/08/11",
",540"
],
[
"Finn Camacho",
"Support Engineer",
"San Francisco",
"2927",
"2009/07/07",
",500"
],
[
"Serge Baldwin",
"Data Coordinator",
"Singapore",
"8352",
"2012/04/09",
"8,575"
],
[
"Zenaida Frank",
"Software Engineer",
"New York",
"7439",
"2010/01/04",
"5,250"
],
[
"Zorita Serrano",
"Software Engineer",
"San Francisco",
"4389",
"2012/06/01",
"5,000"
],
[
"Jennifer Acosta",
"Junior Javascript Developer",
"Edinburgh",
"3431",
"2013/02/01",
",650"
],
[
"Cara Stevens",
"Sales Assistant",
"New York",
"3990",
"2011/12/06",
"5,600"
],
[
"Hermione Butler",
"Regional Director",
"London",
"1016",
"2011/03/21",
"6,250"
],
[
"Lael Greer",
"Systems Administrator",
"London",
"6733",
"2009/02/27",
"3,500"
],
[
"Jonas Alexander",
"Developer",
"San Francisco",
"8196",
"2010/07/14",
",500"
],
[
"Shad Decker",
"Regional Director",
"Edinburgh",
"6373",
"2008/11/13",
"3,000"
],
[
"Michael Bruce",
"Javascript Developer",
"Singapore",
"5384",
"2011/06/27",
"3,000"
],
[
"Donna Snider",
"Customer Support",
"New York",
"4226",
"2011/01/25",
"2,000"
]
]
}
将 opal
添加到 Gemfile
,
gem 'opal-rails'
gem 'opal-jquery'
application.js.rb
内容,
require 'opal'
require 'jquery'
require 'opal-jquery'
require 'datatables.min'
require_tree '.'
将 datatables.min.js
文件添加到 app/assets/javascripts
文件夹
html,
<table id="organizations-datatable" class="display" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Extn.</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
</table>
注意 :- 如果你想让它与 POST 一起工作,你必须调整你的 config/routes.rb
,
在 routes.rb 中为您的 json 文件添加以下条目,
对我来说,
post '/data.json', :to => redirect('/data.json')
对你来说,
post '/organizations/datatable.json', :to => redirect('/organizations/datatable.json')
完整代码在这里 https://gitlab.com/shoyebsheikh/opal-datatables
Ajax数据tables railsgem解决方案:
假设这是数据源,您可以将以下行添加到您的路线中,
post '/organizations/datatable.json', :to => redirect('/organizations/datatable.json')
你的控制器应该是这样的,
class OrganizationsController < ApplicationController
def datatable
params["columns"] ||= { "0" => {"data" => "" } }
params["length"] ||= -1
respond_to do |format|
format.html
format.json { render json: OrganizationDatatable.new(params) }
end
end
end
而你的数据table如下,
class OrganizationDatatable < AjaxDatatablesRails::ActiveRecord
def view_columns
# Declare strings in this format: ModelName.column_name
# or in aliased_join_table.column_name format
@view_columns ||= {
# id: { source: "Organization.id" },
name: { source: "Organization.name",cond: :like, searchable: true, orderable: true },
desc: { source: "Organization.description",cond: :like, searchable: true, orderable: true },
industry: { source: "Organization.industry",cond: :like, searchable: true, orderable: true },
tags: { source: "Organization.tag_list", searchable: false, orderable: false }
}
end
def data
records.map do |record|
{
# id: record.id,
name: record.name,
desc: truncate(record.description,length: 240, separator: ' '),
industry: record.industry,
tags: record.decorate.buttonize_tags,
DT_RowId: record.id
}
end
end
def get_raw_records
Organization.all
end
end
在您的 organizations.js.rb
中输入蛋白石代码,
Document.ready? do
token = Element['meta[name=csrf-token]'].attr('content');
settings = {
"ajax": {
"url": Element['#organizations-datatable'].data('source'),
"type": 'POST',
"beforeSend": lambda do |xhr|
`xhr.setRequestHeader('X-CSRF-Token', token)`
end
},
"pagingType": "full_numbers",
"destroy": true,
"columns": [
{"data": "name"},
{"data": "desc"},
{"data": "industry"},
{"data": "tags"}
]
}
Element['#organizations-datatable'].dataTable(settings.to_n)
end
并且在html,
<table id="organizations-datatable" data-source="<%= organizations_index_path(format: :json) %>">
<thead>
<tr>
<th>Name</th>
<th>Desc</th>
<th>Industry</th>
<th>tags</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
organizations_index_path
可以是 organizations_path
或像 organization_index_path
或 organization_path
这样的单数形式,具体取决于您的控制器名称
详情请参考https://gitlab.com/shoyebsheikh/ajax-datatables-rails-with-opal
注:
- 已使用 mysql2 gem。
- 运行 迁移并将条目添加到 table 来自 rails CLI 或在 table. 中手动
- 如果你运行安装所有依赖项和运行迁移后的项目,请访问http://localhost:3000/user/index or http://localhost:3000/hello_world/index