这听起来像你正在寻找的答案是一个自定义表单生成器。您可以创建表单构建器并从Rails表单构建器继承,然后将该表单构建器设置为应用程序中的默认值。然后,您可以定义一个名为dependent_dropdown或cascading_selection等的元素。此元素可能会采用源下拉列表的ID。你的助手会输出一个collection_select,但它也会输出一些JavaScript,当源代码下拉改变时会触发AJAX调用。
当然,你不必这样做。您可以只使用一个collection_select,在源代码下拉列表中添加一些属性(例如:class => 'source_for_dependent', :dependent => some_id
),然后在application.js中挂接一些查找具有source_for_dependent
类的集合的JavaScript,并在该事件触发时抓取该ID dependent
属性并触发AJAX调用。
无论哪种方式,这里是你的JavaScript(使用jQuery)
$('select.source_for_dependent').change(function() {
var id = // get the id of the dependent dropdown, perhaps by $(this).attr('dependent')
var dependentDropDown = $('#' + id);
dependentDropDown.empty();
var success = function(response) {
for (var item in response) {
var option = $(document.createElement('option')).val(item.val).html(item.text);
dependentDropDown.append(option);
}
}
$.get('/some_controller/some_action/' + $(this).val(), success);
}
的成功处理程序被传递到jQuery的get
方法的例子。它将JSON响应作为参数。我们循环回应,并为每个项目创建一个option
,将值和文本从项目中拉出,然后将其附加到依赖项下拉菜单中。你的控制器可以是这个样子:
def some_action
@obj = SomeClass.find(params[:id])
respond_to do |format|
format.js { render :json => @obj }
end
end
编辑
哪个控制器,你的目标是你。比方说,下拉式A指向资源A,下拉式B指向资源B.类型为A
的对象应该有一个B
类型的对象列表。如果您要追踪对象A
的show
操作,则对象A
的as_json
方法需要包括其B
关联。This article显示了这个例子。
否则,您可以将资源B
的index
操作作为目标。使B
嵌套的资源A
将是一个简单的方法来键入A
的id以获取B
类型的所有对象,它们的外键指向A
。
http://stackoverflow.com/questions/3332474/how-to-make-ajax-calls-with-rails-3-using-remote-function – 2010-12-21 22:54:02
像这样,remote_function被释放。 请参阅第三个答案:http://stackoverflow.com/questions/3332474/how-to-make-ajax-calls-with-rails-3-using-remote-function 我想做一些最简洁的事情像帮手一样。帮助者将完成ajax操作。这是可能的 ??? – 2010-12-21 23:07:12