Javascript 使用UJS创建helper标记
首先,对不起我的英语。我是一个正在进步的巴西人 我想创建一个名为“collection\u cascading\u select”的助手标记。 该助手类似于“collection_select”,但他还有一个名为“source”的参数。 “源”是视图中的另一个集合 即使在“源”中选择了另一个选项,JavaScript函数也需要运行以获取其值。然后填充该值的“集合\u层叠\u选择”集合 这让人困惑!我在这个问题上已经有一个星期了,我的巴西兄弟们没有帮我 谢谢 [编辑] @萨莫 我让它工作,但有一些变化Javascript 使用UJS创建helper标记,javascript,ruby-on-rails,ruby,ajax,ruby-on-rails-3,Javascript,Ruby On Rails,Ruby,Ajax,Ruby On Rails 3,首先,对不起我的英语。我是一个正在进步的巴西人 我想创建一个名为“collection\u cascading\u select”的助手标记。 该助手类似于“collection_select”,但他还有一个名为“source”的参数。 “源”是视图中的另一个集合 即使在“源”中选择了另一个选项,JavaScript函数也需要运行以获取其值。然后填充该值的“集合\u层叠\u选择”集合 这让人困惑!我在这个问题上已经有一个星期了,我的巴西兄弟们没有帮我 谢谢 [编辑] @萨莫 我让它工作,但有一些
var success = function(response) {
for (var item in response){
var id = response[item].breed.id <--------------------
var name = response[item].breed.name <-------------------
var option = $(document.createElement('option')).val(id).html(name)
dependentDropDown.append(option)
}
}
var成功=功能(响应){
用于(响应中的var项目){
变量id=响应[项目].bride.id听起来您想要的答案是自定义表单生成器。您可以创建表单生成器并从Rails表单生成器继承,然后将该表单生成器设置为整个应用程序的默认值。然后您可以定义一个名为dependent_dropdown或cascading_selection的元素,等等。此元素可能会获取源下拉列表的id。您的助手将输出一个集合,但它也将输出一些JavaScript,当源下拉列表更改时,这些JavaScript将触发AJAX调用
当然,您不必这样做。您可以使用一个集合来选择,将一些属性添加到源下拉列表中(即:class=>'source\u for\u dependent',:dependent=>some\u id
),然后在application.js中连接一些JavaScript,这些JavaScript使用source\u for_dependent
类查找集合,当onchange
事件触发时,它从dependent
属性获取id并触发AJAX调用
不管怎样,下面是一个JavaScript示例(使用jQuery)
成功处理程序被传递到jQuery的get
方法中。它将JSON响应作为参数。我们循环响应,并为每个项创建一个选项,从项中提取值和文本,然后将其附加到依赖下拉列表中。您的控制器可能如下所示:
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
关联。显示了这方面的示例
否则,您可以针对资源B
的索引操作。使B
成为a
的嵌套资源将是一种简单的方法,可以键入a
的id,以获取所有类型B
的对象,这些对象具有指向a的外键。当然,我错了。您必须给出t“源”下拉列表是一个不同的类…我想不出一个好名字,可能是“源”或类似的名字。比如,如果我的答案有用,可以用一个向上的投票或一个绿色的勾号吗?:)在for-In迭代中,项返回一个字符串,而不是一个对象。因为这样,我无法处理数据。奇怪的是,我在没有迭代的情况下会得到工作。其他我需要指定数据类型(json)在$.get to work中。感谢您的有效帮助。您需要知道响应对象中包含的内容。在处理程序函数中设置断点并使用firebug进行检查将向您展示如何访问对象的属性。如果您需要关联,您可能必须覆盖模型中的as_json方法以包含此外,还有一种方法可以指定所有XHR请求都接受JSON,这样您就不必为每个AJAX调用指定JSON。请参见此处:我不会从电子邮件中的(这个)问题中获得更新。奇怪的是,“如果您需要关联,您可能必须在您的模型中重写as_JSON方法以包含它们。”。抱歉,我不理解这一点。
def some_action
@obj = SomeClass.find(params[:id])
respond_to do |format|
format.js { render :json => @obj }
end
end