2013-05-11 63 views
1

我想實現Railscast稍微更高級的版本覆蓋數據表。通過ajax datatables不接受嵌套的json作爲正確的數據

當控制器通過iteslf提供WaresDatatable.new(view_context)響應時,我能夠通過ajax獲得表格,這是一個勝利。

但是,當我嘗試擴展我所做的並且讓json嵌套以便數據表和其他函數可以使用json響應時,ajax datatable不再加載數據。

我對此比較陌生,對這個看似微不足道的小問題一直在抨擊我的頭腦。

控制器:

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":"[email protected]","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 [email protected] bu","selfdescription":"<p><span style=\"font-family:comic sans ms,cursive\">This is my new website info</span></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>&nbsp;</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能夠處理嵌套的資源,所以我很確定它只是我。如果任何人都可以指出我正確的方向非常感謝。

回答

0

我知道這是一個老問題,但請注意sAjaxDataProp

它可以讓你設置一個自定義的屬性,而不是aaData,但我還沒有找到一種方法來告訴數據表在其他地方尋找sEcho等。