Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript函数中使用Ruby?_Javascript_Ruby On Rails - Fatal编程技术网

如何在Javascript函数中使用Ruby?

如何在Javascript函数中使用Ruby?,javascript,ruby-on-rails,Javascript,Ruby On Rails,我意识到这在我的问题的措辞上是不可能的,但是有没有一种方法仍然可以得到我想要的结果呢 在Rails 3.2应用程序中,我有一个带有城市和位置字段的表单: <%= f.select :city, City.all, :prompt => "Select..." %> <%= f.input :location_name, :input_html => { data:{ autocomplete_source: Location.order(:name).map(

我意识到这在我的问题的措辞上是不可能的,但是有没有一种方法仍然可以得到我想要的结果呢

在Rails 3.2应用程序中,我有一个带有城市和位置字段的表单:

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

在coffeescript中,我可以做如下操作:

jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','#{Location.where(city_id: @myform.city_id).order(:name).map(&:name)}')
但是不调用活动记录查询,它只是作为字符串传入


使用新查询动态更改此自动完成源属性的最佳方法是什么

您不能这样做,因为Javascript在客户端,Ruby在服务器端运行。Javascript没有“看到”Ruby,因为这一点(ERB有点不同:它在客户端接收之前被转换成HTML)。我建议你通过一个简单的方法来做这件事

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

$("#link_id").bind "ajax:complete", (e, xhr, settings) ->
    #TODO function body goes here
jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','<%= Location.where(city_id: @myform.city_id).order(:name).map(&:name) %>')
或者这个:

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

在这个函数中,您可以使用
jQuery.parseJSON(xhr.responseText)
解析JSON,并根据需要处理这些数据。这看起来很复杂,但实际上很简单。

将您的coffeescript从filename.js.coffee重命名为filename.js.coffee.erb。然后你可以这样做:

$("#link_id").bind "ajax:complete", (e, xhr, settings) ->
    #TODO function body goes here
jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','<%= Location.where(city_id: @myform.city_id).order(:name).map(&:name) %>')
jQuery->
$(“#myform_city_id”)。更改->
$('#myform_location_name').attr('data-autocomplete-source','')

谢谢@yuri,我已经玩了几天了,dit看起来很有希望,但由于我有限的javascript技能,我仍然不清楚如何将这一切结合起来。你能提供一个使用我问题中代码的例子吗?我正在努力解决的是如何检测city_id值是否已设置,以及如何应用两个查询中的一个。我将为您制作一个教程,稍后发布链接。但是您应该尽快学习Ajax和Javascript。这些是web开发人员的基本知识你的教程。您的服务器必须发送您需要的数据,您将在Javascript上处理这些数据。嗨,Yuri,谢谢您的精彩教程。对不起,我想不清楚。我知道如何创建ajax请求,但我不知道如何使其适合我的情况。首先,我不使用链接,因此请求必须由城市选择字段触发。其次,location字段需要访问两个json字符串,这取决于是否选择了一个城市。因此,触发器需要向控制器传递一个参数,该控制器包含一个条件语句。虽然我可以看到如何通过链接实现这一点,但我看不到如何连接select字段。只需执行一个控制器操作,作为结果
位置。where(city\u id:@myform.city\u id)。order(:name)。map(&:name)
,并通过Javascript完成它。