情景:
解决方法:
在使用 rail 中的 自动完成功能 auto_complete_field时,假若返回的页面中有 javascript脚本,那它将不会被返回。 必需把它用 javascript_function 方法进行改写。
a.rhtml 中 render _b.rhtml 页面。 在_b.rhtml中如果包含了 javascript脚本,则不能被render到a.rhtml中。
我在_b.rhtml中用了auto_complete_field来对用户输入进去提示。因为auto_complete_result 返回的已经是javascript脚本了,就不能把javascript发送给客户端。
解决方法:
在application_helper.rb中覆盖此方法:不返回javascript脚本,把结果放到_b.rhtml中 用javascript_function方法把脚本输出到客户端。
def auto_complete_field_no_javascript_tag(field_id, options = {})
function = "var #{field_id}_auto_completer = new Ajax.Autocompleter("
function << "'#{field_id}', "
function << "'" + (options[:update] || "#{field_id}_auto_complete") + "', "
function << "'#{url_for(options[:url])}'"
js_options = {}
js_options[:tokens] = array_or_string_for_javascript(options[:tokens]) if options[:tokens]
js_options[:callback] = "function(element, value) { return #{options[:with]} }" if options[:with]
js_options[:indicator] = "'#{options[:indicator]}'" if options[:indicator]
js_options[:select] = "'#{options[:select]}'" if options[:select]
js_options[:paramName] = "'#{options[:param_name]}'" if options[:param_name]
js_options[:frequency] = "#{options[:frequency]}" if options[:frequency]
{ :after_update_element => :afterUpdateElement,
:on_show => :onShow, :on_hide => :onHide, :min_chars => :minChars }.each do |k,v|
js_options[v] = options[k] if options[k]
end
function << (', ' + options_for_javascript(js_options) + ')')
function
end