データテーブルをカバーするRailscastのもう少し高度なバージョンを実装しようとしています。
コントローラーが勝利した iteslf による WaresDatatable.new(view_context) 応答を提供しているときに、ajax を介してテーブルを機能させることができます。
ただし、自分が行っていることを拡張してjsonをネストして、データテーブルやその他の関数がjson応答を使用できるようにすると、ajaxデータテーブルはデータをロードしなくなります。
私はこれに比較的慣れておらず、この一見小さな問題に対してしばらく頭を悩ませてきました。
コントローラ:
respond_to do |format|
format.html # show.html.erb
#format.json { render :json => @contributor }
format.json {
render :json => {
:warestable => WaresDatatable.new(view_context),
:contributor => @contributor
}
}
end
wares_datatable.rb (railscasts のとおりで、json がネストされていない場合に機能します)
class WaresDatatable
delegate :params, :h, :link_to, :admin_signed_in?, :edit_ware_path, :current_user, to: :@view
def initialize(view)
@view = view
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: Ware.count,
iTotalDisplayRecords: wares.count,
aaData: data
}
end
private
def data
if admin_signed_in?
wares.map do |product|
[
link_to(product.name, product),
product.origin,
product.chron_range,
product.desc,
link_to("View", product) + " "+link_to("Edit", edit_ware_path(product), :class => 'btn btn-mini') + " " +link_to("Delete", product, method: :delete, data: { confirm: 'Are you sure?' }, :class => 'btn btn-mini btn-danger')
]
end
else
wares.map do |product|
[
link_to(product.name, product),
product.origin,
product.chron_range,
product.desc,
link_to("View", product)
]
end
end
end
def wares
@wares ||= fetch_wares
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 1
end
def fetch_wares
contributor = Contributor.find(params[:id])
wares = contributor.wares.order("#{sort_column} #{sort_direction}")
wares = wares.page(page).per_page(per_page)
#wares = wares.user.contributor
if params[:sSearch].present?
wares = wares.where("name like :search or origin like :search or desc like :search", search: "%#{params[:sSearch]}%")
end
wares
end
def sort_column
columns = %w[name origin chron_range desc action]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
JS.Coffee ファイル
jQuery ->
$('#warestable').dataTable
sPaginationType: "full_numbers"
bJQueryUI: true
bProcessing: true
bServerSide: true
sAjaxSource: $('#warestable').data('source')
JSON レスポンス
{"warestable":{"sEcho":0,"iTotalRecords":22,"iTotalDisplayRecords":1,"aaData":[["<a href=\"/wares/1\">crap</a>",null,"old","really crappy condition","<a href=\"/wares/1\">View</a>"]]},"contributor":{"ad_board":true,"avatar_content_type":"image/jpeg","avatar_file_name":"success.jpg","avatar_file_size":90652,"avatar_updated_at":"2013-05-04T01:54:52Z","created_at":"2013-05-01T05:19:51Z","email":"jack@jack.com","first_name":"jack","id":1,"last_name":"frost","name":null,"ptrgrph_id":null,"resume_content_type":"image/png","resume_file_name":"Argentina.png","resume_file_size":42260,"resume_updated_at":"2013-05-04T03:17:50Z","searchable":"jack frost jack@jack.com bu","selfdescription":"<p><span style=\"font-family:comic sans ms,cursive\">This is my new website info</span></p>\r\n\r\n<p> </p>\r\n\r\n<p> </p>\r\n\r\n<p><span style=\"font-family:comic sans ms,cursive\">Hhaahaha</span></p>\r\n","university":"bu","updated_at":"2013-05-08T01:58:58Z","user_id":4,"ware_id":null}}
Datatables はネストされたリソースを処理できるので、それは私だけだと確信しています。誰かが私を正しい方向に向けることができれば、大歓迎です。