0

この質問は以前にも何度も聞かれたことは知っていますが、経験が浅いため、これらの回答を使用して問題を修正することはできません。以前のRailsプロジェクトで動作させていましたが、何が変更されたかを確認できません。MySQLではなくPostgreSQLを使用して新しいプロジェクトを開始し、現在Rails 3.2.8(以前は3.2.1)を使用しています。

Firebugの表示:TypeError:aDataは次の場所で未定義です:

var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
for ( var i=0, iLen=aData.length ; i<iLen ; i++ ) 

これは、Datatablesが正しいJSONを取得していないことが原因である可能性があります。以下に、JSONLintで検証するスニペットを示します。

[{"code":"STATE 30","created_at":"2012-12-10T06:01:34Z","id":1,"name":"ALBANY     HIGHWAY","rank":null,"state":"WA","updated_at":"2012-12-10T06:01:34Z"},{"code":"ANNE BEADELL HIGHWAY","created_at":"2012-12-10T06:01:34Z","id":2,"name":"ANNE BEADELL HIGHWAY","rank":null,"state":"SA","updated_at":"2012-12-10T06:01:34Z"},...

iTotalRecords、iTotalDisplayRecords、aaDataが含まれていないようです。これは問題ですか?JSONオプションはdefas_jsonによって設定されていると思いますが、レンダリングで明示的に参照していませんか??。http get(Firebugで見られるように)にはsEchoが含まれますが、iTotalRecordsは含まれません。

私のコードはRailsCasts#340に基づいています:

コントローラ:(リストアクションを参照)。

class HighwaysController < ApplicationController
  respond_to :html, :json

def index
  @highways = Highway.all
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @highways }
  end
end

def list
  @highways = Highway.all
  logger.debug "Highway Count: #{@highways.size}"
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: HighwaysDatatable.new(view_context)}
  end
end

関連するRubyコード:

class HighwaysDatatable
  delegate :params, :h,:link_to,:number_to_currency,to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    {
     sEcho: params[:sEcho].to_i,
     iTotalRecords: Highway.count,
     iTotalDisplayRecords: highways.total_entries,
     aaData: data
    }
  end

  private

  def data
    highways.map do |highway|
      [
       h(highway.id),
       h(highway.name),
       h(highway.state),
       h(highway.code),
       h(highway.rank),
       h(highway.created_at),
       h(highway.updated_at)
      ]
    end
  end

  def highways
    @highways ||= fetch_highways
  end

  def fetch_highways
    ...  (as per RailsCasts code - code wrapped and did not show properly)    
  end
   highways
 end

 def page
   params[:iDisplayStart].to_i/per_page + 1
 end

 def per_page
   params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
 end

 def sort_column
  columns = %w[name state code rank]
  columns[params[:iSortCol_0].to_i]
 end

 def sort_direction
    params[:sSortDir_0] == "desc" ? "desc" : "asc"
 end
end

およびリストビュー:

<% @page_title = "Highways List" %>

  <h2>Highways</h2>

  <%= javascript_tag do %>
    window.highwaysURL = '<%= j highways_url %>';
  <% end %>

  <div id="EditLink">
    <%= link_to "Edit Highway", :controller => :highways, :action => :edit, :id => 1 %>
  </div>  
  <div>
    </br>
      <%= link_to 'Neighbours', '/neighbours/' %>
      <%= link_to 'Localities', '/localities/' %>
    </br>
  </div>
  <div id="tools">

  </div>      


 <table id="highways" class="display" data-source="<%= highways_url(format: "json") %>">
    <thead>
      <tr>
        <th>Id</th>
        <th>Highway</th>
        <th>State</th>
        <th>Code</th>
        <th>Rank</th>
        <th>Created At</th>
        <th>Updated At</th>
      </tr>
    </thead>
    <tbody>

    </tbody>    
 </table>

 <div id=editarea class='result'    ></div> 

私のgemfile(コメントは削除されています):

source 'https://rubygems.org'

gem 'rails', '3.2.8'
gem 'pg'
group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'
  gem 'uglifier', '>= 1.0.3'
end
gem 'libv8', '~> 3.11.8'
gem 'therubyracer', require: 'v8'
gem 'jquery-rails'
gem 'will_paginate'
gem 'debugger'

およびアセットパイプラインのapplication.js:

//= require jquery
//= require jquery-ui
//= require jquery.dataTables
//= require TableTools
//= require ZeroClipboard
//= require datatable_highways
//= require datatable_localities
//= require datatable_neighbours
//= require_tree .

それはおそらく単純なことですが、それは私をしばらくの間妨げてきました。期待してくれてありがとう。

アップデート

DataTablesデバッガーのブックマークレットは、「リスト」ビューが、DataTablesで期待されるjsonパラメーターを含まない以下をレンダリングしていることを示しています。

http://localhost:3000/highways.json 

そして私はそれがすべきだと信じています:

http://localhost:3000/highways/list.json.

これがコントローラーなのかビューの問題なのかわかりません。

アップデート

私はさまざまな変更を加えましたが、それでも同じ問題があります。しかし、ログには重要な2つのことがわかります。

localhost:3000 / highways / listと入力すると、2つのビューがレンダリングされます。

 Processing by HighwaysController#list as HTML [1m[36mHighway Load (4.8ms)[0m  [1mSELECT "highways".* FROM "highways" ORDER BY name  
 Highway Count: 229
 Rendered highways/list.html.erb within layouts/highways (32.6ms)

それから

Processing by HighwaysController#index as JSON
Parameters: {"sEcho"=>"1", "iColumns"=>"5", "sColumns"=>"", "iDisplayStart"=>"0",...    

1つ目はHTML(アクション'list'経由)、2つ目はJSON(アクション'index'経由)です。

したがって、2つの問題があります。

  1. 最初のレンダリングにはデータリクエストが関連付けられており、DataTablesから「すでに初期化されています」という警告が表示されます。

  2. 私のroutes.rb明示的一致ステートメントはビューをレンダリングするためにHTMLをキャッチしていますが、JSON応答(データ行のAJAX呼び出しから)は失敗し、resources:highwaysによって処理され、コントローラ

ルート.rb

match 'highways/list'=> 'highways#list' 
...
resources :highways

ビュー(列見出しなど)をレンダリングしたいだけの場合、データ要求を停止するにはどうすればよいですか?
コントローラの「list」アクションにJSON応答を送信するにはどのルートが必要ですか?

4

1 に答える 1

0

解決しました。Ryan Bates #340 コードを使用した 1 つのテーブルという最小限のセットアップに戻りました。まだ動作していません。gem を rweng github から削除し、DataTables ファイルを ./vendor/assets にロードしました。今すぐ動作します。インデックスまたはリスト アクションは、おそらく明示的なルートで修正できます。

于 2013-02-28T21:35:10.763 に答える