0

我意识到这在我的问题措辞方式上是不可能的,但是有没有办法仍然得到我正在寻找的结果。

在 Rails 3.2 应用程序中,我有一个包含 City 和 Location 字段的表单:

<%= f.select :city, City.all, :prompt => "Select..." %>
<%= f.input :location_name, :input_html => {    data:{ autocomplete_source: Location.order(:name).map(&:name) } } %>

location 字段使用 Twitter Bootstrap 的 typeahead 功能来显示条目的自动完成列表。

一个位置属于一个城市。我想根据用户选择的城市值过滤自动完成条目列表。

基本上,我需要动态改变

... autocomplete_source: Location.order(:name).map(&:name) ...

... autocomplete_source: Location.where('city_id => ?', '@myform.city.id').order(:name).map(&:name) ...

在咖啡脚本中,我可以执行以下操作:

jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','#{Location.where(city_id: @myform.city_id).order(:name).map(&:name)}')

但是没有调用活动记录查询,它只是作为字符串传入。

使用新查询动态更改此 autocomplete-source 属性的最佳方法是什么?

4

2 回答 2

1

你不能这样做,因为 Javascript 在客户端,Ruby 在服务器端运行。由于这个原因,Javascript 不会“看到”Ruby(ERB 有点不同:它在客户端接收之前被转换为 HTML)。我建议您通过Ajax 请求来执行此操作。

更好地解释:您从一个控制器执行一个操作,该控制器为您提供所需内容的 JSON 表示(它甚至可以是现有控制器,但将其作为 JSON 发送)。您通过 Ajax 调用此控制器(:remote => true在您的链接上使用)。您将 ajax:complete 响应事件从该链接绑定到一个函数,如下所示:

$("#link_id").bind "ajax:complete", (e, xhr, settings) ->
    #TODO function body goes here

或这个:

$("#link_id").bind "ajax:complete", functionName

在此函数内部,您可以解析 JSONjQuery.parseJSON(xhr.responseText)并使用此数据执行您想要的操作。看似复杂,其实很简单。

于 2012-06-30T16:13:11.057 回答
0

将您的咖啡脚本从 filename.js.coffee 重命名为 filename.js.coffee.erb。然后你可以做这样的事情:

jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','<%= Location.where(city_id: @myform.city_id).order(:name).map(&:name) %>')
于 2012-07-21T06:00:37.763 回答