如何使用jquery在collection_select中进行onchange

时间:2010-02-14 03:06:23

标签: jquery ruby-on-rails prototypejs

我在我的html页面上使用jquery,并希望在collection_select上有一个onchange事件。

如果我添加<%= javascript_include_tag :defaults %>,那么我的jquery代码不起作用。

基本上我有一个collection_select如下:

<%=collection_select(:product, 'prod_name', @prods, :id, :prod_name, 
{:prompt => 'Select Product'},{:onchange =>  remote_function(:url => 
{:action => 'volume_or_quant'}, :with => "'id=' + this.value")})%>

然后我有一个选择标记和一个文本字段:

<%=select_tag :volume, options_for_select(["", "1/8 lb", "1/4 lb", "Single", 
"Multi 5" ], "N/A") %>
<%= text_field_tag :quantity, "", :size=>"4"%>

当从collection_select中选择一个选项时,我想回到我的操作并检查它是否在数据库中有音量或单位。基于此,将启用上述选择框/文本框。

现在我的行​​动看起来像:

def volume_or_quant
    @product = Product.find(params[:id])
    puts "Value: " + @product.volume        
end

然而,当我选择一些东西时......没有任何反应。现在我没有默认的javascripts。

我正在尝试做什么需要默认原型javascript?或者可以用jquery完成吗?

2 个答案:

答案 0 :(得分:3)

是的,remote_function要求包含Prototype库。它可以使用jQuery完成,但不能在尝试时使用remote_function帮助程序。

让jQuery正常工作:

包含默认值时出现的问题是Prototype尝试使用$,jQuery也是如此。您可以使用jQuery的noConflict模式来解决此问题。

包括您最初尝试过的默认值,但请遵循此建议以使jQuery再次运行:

您可以做一些事情,但是如果您使用jQuery的本地副本,请将其添加为最后一行(并在javascript_include_tag调用中的默认值之后包含jQuery):

jQuery.noConflict();

如果您使用的是Google CDN,请执行以下操作:

<%= javascript_include_tag :defaults, "http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" %>
<script type="text/javascript"> jQuery.noConflict() </script>

然后,确保所有jQuery代码都包含这个(对于过去住在document.ready的任何代码:

// $ = Prototype
jQuery(document).ready(function($){
    // $ = jQuery
});

// or shorthand:
jQuery(function($){
    // $ = jQuery
});

或者只是使用它(创建一个私有范围,其中$ = jQuery):

// $ = Prototype
(function($){
    // $ = jQuery
})(jQuery);

答案 1 :(得分:0)

默认情况下,rails配置或包含使用原型而不使用jquery,代码<%= javascript_include_tag :defaults %>包括运行时html的原型脚本。像jRails这样的rails有一些插件可以使用rails启用jQuery,但它还没有与rails无缝集成。