在Rails中使用本地数据进行自动完成

3
在我的应用程序中,用户从自动完成文本字段中选择火车站。由于火车站不多(约100个),我更喜欢根据客户端数组的内容自动完成字段,而不是每次用户键入字符时查询服务器(目标是使自动完成更具响应性)。
我的问题是如何以可维护的、非hacky方式在Rails中实现这一点。我的当前解决方案只是将这行代码放在index.html.erb的底部:
<%= javascript_tag "var stations = #{Station.all.map {|s| s.name}.to_json}" %>

但这并不是很好(首先,我在application.js上工作时必须记住“stations”变量名)。

2个回答

2
您可以创建一个动态生成的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' %>

这假设它在“javascripts”路径下,如果您有一个javascripts控制器,则情况就是如此。否则,您将不得不传递完整路径。
这样做的缺点是会向Rails应用程序发出更多请求,但您可以将页面缓存添加到该js动作中以优化它。

这个问题在于你可能会把服务器端代码放到公开可见的位置。 - Mike Trpcic
stations.js.erb 视图文件不位于 public 目录下,而是与其他模板一起位于 views 目录下。因此,您不必像任何其他模板一样担心将其暴露出去的风险。 - ryanb
这个回答还有效吗?我似乎无法让它起作用 :\ - jon

1
在你的application.js文件中,在文档准备就绪时,进行一个ajax调用来填充本地数组的值。
document.observe("dom:loaded", function() {
  var stations;
  new Ajax.Request(url, {
    method: 'get',
    onSuccess: function(transport) {
      stations = transport.responseText;
    }
  });
});

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接