1

データテーブルをカバーする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>&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 はネストされたリソースを処理できるので、それは私だけだと確信しています。誰かが私を正しい方向に向けることができれば、大歓迎です。

4

1 に答える 1

0

これは古い質問ですが、sAjaxDataPropを調べてください。

aaDataの代わりにカスタムプロパティを設定できますが、データテーブルにsEcho他の場所を探すように指示する方法が見つかりませんでした.

于 2014-09-03T08:52:26.597 に答える