2009-08-07 81 views
3

在我的应用程序中,用户从自动填充文本字段中选择火车站。由于没有太多的火车站(〜100),我更喜欢基于客户端数组的内容自动完成,而不是每次用户键入字符时都要查询服务器(目标是使自动填充响应更快)。使用Rails中的本地数据自动填充

我的问题是如何以可维护,非hacky的方式在Rails中做到这一点。我目前的解决方案只是把这种线在index.html.erb底部:

<%= javascript_tag "var stations = #{Station.all.map {|s| s.name}.to_json}" %> 

但这不是很大(一两件事,我一定要记得“站”变量名,而我的工作application.js) 。

回答

1

在您的application.js文档就绪时,请执行ajax调用以使用值填充本地数组。

document.observe("dom:loaded", function() { 
    var stations; 
    new Ajax.Request(url, { 
    method: 'get', 
    onSuccess: function(transport) { 
     stations = transport.responseText; 
    } 
    }); 
}); 

我的例子可能并不完美(我使用jQuery通过jrails现在),但它应该给正确的印象。

2

您可以制作一个类似于how I show here的动态生成的Javascript视图文件。

基本上,如果你有一个控制器动作(例如一个javascripts控制器站动作)。它可能看起来像这样。

# in controllers/javascripts_controller.rb 
def stations 
    @stations = Station.all 
end 

那么你可以做这样一个JavaScript视图文件...

// in views/javascripts/stations.js.erb 
var stations = <%= @stations.map(&:name).to_json %>; 
// ... 

的JavaScript文件可以包含任何你想要的JavaScript,所以你可以很可能将部分的application.js代码的存在。然后,您可以像包含任何其他JavaScript文件一样包含它。

<%= javascript_include_tag 'stations' %> 

这是假设它是“JavaScript的”路径恰好,如果你有一个JavaScript的控制器是这种情况下。否则,你必须通过完整的路径。

这样做的缺点是向Rails应用程序发出一个更多的请求,但是您可能会将页面缓存添加到该js操作以优化该操作。

+0

这样做的问题是,您可能会将服务器端代码放入可公开查看的位置。 – 2009-08-07 21:03:27

+0

stations.js.erb视图文件不在公共目录中。它正在与其他模板一起查看。因此,您不会像其他任何模板那样暴露它。 – ryanb 2009-08-07 21:10:37

+0

此答案仍然有效吗?我似乎无法得到它的工作:\ – jon 2014-05-14 01:43:14