2

假设我有两个模型:customersorders。每个订单都属于一个客户。

我还设置了一个带有显示所有订单的数据表的订单(索引)视图。如果我想查看给定客户的所有订单,我所要做的就是过滤该客户的结果,在“搜索”字段中写入相关客户名称或从其列过滤字段中选择该客户。

现在我想实现一个客户订单链接,它会自动显示带有这些设置的订单数据表。

换句话说,我希望 /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)设置特定列

最后一个要解决的问题,鉴于我正在使用带有选择元素的单个列过滤(http://www.datatables.net/release-datatables/examples/api/multi_filter_select.html),因此根据 URL 设置每个选择元素-通过的参数。我用这个 jQuery 指令做到了:

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

从性能的角度来看,这个解决方案是可以改进的,但是它很简单而且很有效。

于 2012-05-10T16:32:49.020 回答