2

顧客注文の2つのモデルがあるとします。すべての注文は顧客のものです。

また、すべての注文を表示するDatatableを使用して注文(インデックス)ビューを設定しました。特定の顧客のすべての注文を表示したい場合は、その顧客の結果をフィルタリングして、[検索]フィールドに関連する顧客名を入力するか、列フィルターフィールドからその顧客を選択するだけです。

次に、これらの設定で注文データテーブルを自動的に表示する顧客注文リンクを実装したいと思います。

つまり、/orders?isearch='customer_name+customer_surname'へのリンクで、検索フィールドにすでに顧客のフルネームが入力されている(またはそれに応じて顧客列フィルターが設定されている)データテーブルが表示されるようにしたいと思います。

もちろん、コントローラーから@customerインスタンス変数をフェッチしてビューに渡すことはできますが、それでは

4

1 に答える 1

5

初期化コードでoSearch変数を使用すると、検索フィールドの初期化値であるisearch変数を定義できます。

$(document).ready( function() {

  var isearch = $('#isearch').val()   

  $('#example').dataTable( {
    "oSearch": {"sSearch": isearch}
  } );
} ) 

isearch値は、ビューの適切な非表示フィールドに保存されます。

 <%= hidden_field_tag "isearch", @isearch.to_s, { :id => "isearch" } %>  

これは、Railsの.jsファイルにインスタンス変数を渡すためにこれまでに見つけた最良の方法です)。

最後になりましたが、@isearchインスタンス変数はorder_controllerから設定されます。

@isearch = params[:isearch]  

もちろん、その値は次のようにURLに渡す必要があります。

.../orders?isearch='customer_name+customer_surname'

----補遺----

インスタンス変数は必要ないことがわかりました。実際、このjavascript関数を使用して、必要な数のurlパラメーターを渡すことができます。

function getUrlParam( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1].replace("+", " ");

}

次に、次のように.jsファイルからそれらをフェッチできます。

// fetches url params
var isearch = getUrlParam('isearch');
var customer_name = getUrlParam('customer_name');
var order_status = getUrlParam('order_status');

これらの値に従って、oSearch変数を設定できるだけでなく、Datatables aoSearchCols初期化パラメーター(http://www.datatables.net/ref#aoSearchCols)を使用して列固有の設定もできます。

解決する最後の問題は、select要素(http://www.datatables.net/release-datatables/examples/api/multi_filter_select.html)で個別の列フィルタリングを使用しているため、URLに従ってすべてのselect要素を設定することです。 -渡されたパラメータ。私はこのjQuery命令でそれを行いました:

// sets all select filters according to url passed params
$('select').val([customer_name, preparation_kind, preparation_status]);

パフォーマンスの観点から、このソリューションは改善可能ですが、簡単で機能します。

于 2012-05-10T16:32:49.020 に答える