Rails 3的原型在一个带有数据库调用的表单中创建动态下拉框
Rails 3 with Prototype Making Dynamic Drop Downs inside a form with database calls
我一直在寻找一种创建动态下拉列表的好方法,它是表单的一部分。下拉框需要根据前一个下拉框填充来自数据库的数据。我还没有找到一个好的rails 3/原型解决方案。我已经看到了一些使用jQuery和使用原型遗留助手的部分解决方案。然而,我读到这不是一个好主意,使用遗留的助手,所以我试图做到没有他们,而仍然使用原型。
我知道这是一个很大的问题,但是,我认为这已经做了几次,如果有人有一个很好的方法,将不胜感激。如果没有,我的攻击计划是使用onchange触发javascript调用向服务器发送请求。然后用适当的选项更新部分,即下一个选择框,然后重复。
直接问题:如何使用prototype生成ajax页面调用?我需要将第一个下拉的结果发送到我的控制器。url将是car_info/update_make/"year"。我有这个选择标签在我的更大的形式,调用javascript函数。
<%= select_tag 'year', options_from_collection_for_select(@vehicle_years, "year", "year"), {:include_blank => true, :onchange => "submitYear(this.value)" }%>
感谢您在我开始学习Rails时提供的任何帮助。
更新:我用这个javascript生成一个请求到服务器:
function submitYear(year){
new Ajax.Request('/udpate_make/'+year, {method: 'get'});
}
但是,它不会生成正确的url。如果我输入/car_infos/update_make,它会生成car_infos/car_infos/udpate_make/。如果我在/car_infos部分,它只是做/update_make和离开car_infos。我要么得到两个,要么没有。仍然不确定如何生成"car_infos/update_make/year"的适当url,我将实现@Jaryl提到的观察选项,但仍然有url生成问题。这是我的路线…
resources :car_infos
match 'car_infos/update_make/:year', :controller => 'car_infos', :action => 'update_make'
更新:与另一段旅程
要解决url的重复部分,我必须做以下操作:
function submitYear(year){
new Ajax.Request('update_make/'+year, {method: 'get'});
}
注意前面示例中缺少/。仍然不知道为什么当把car_info放在那里时,它会复制它。但至少我现在生成一个有效的Ajax请求到服务器。
因为您使用的是Rails 3,旧的帮助器已弃用。您应该使用类似jQuery UJS的东西。你要做的是从选择标签中取出JS helper代码,如下所示:
<%= select_tag 'year', options_from_collection_for_select(@vehicle_years, "year", "year") %>
然后在你的JS文件(我在这里使用jQuery),你添加代码,执行JS功能:
$('#year').change(function(e) {
// some AJAX call here using $('#year').val()
});
要在Prototype中做到这一点(参见观察事件的文档),它将是这样的:
Event.observe('#year', 'change', function(event) {
// ...
});
这就是我最终用prototype创建动态下拉菜单的方法,以防其他人沿着这条路走下去。如果有更好的方法,请告诉我:
为适当的控制器创建路由,我的控制器是car_info
match 'car_infos/update_make/:year', :controller => 'car_infos', :action => 'update_make'
match 'car_infos/update_model/:year/:make', :controller => 'car_infos', :action => 'update_model'
内部的形式已经建立了第一个下拉框和渲染部分。
<div id="year_sel">
<%= f.label :car_year %>
<%= select_tag 'year', options_from_collection_for_select(@vehicle_years, "year", "year"), {:include_blank => true, :onchange => "submitYear(this.value)" }%>
</div>
<div id="make_select">
<%= render 'make_sel' %>
</div>
在application.js文件中用javascript构建链接:
function submitYear(year){
new Ajax.Request('update_make/'+year, { method: 'get'});
}
有你的。js。响应ajax请求并呈现部分的RJS文件。
page.replace_html('make_select', render('make_sel'))
在你的控制器函数中,确保它响应.js格式。
希望这能帮助别人,因为我花了两天时间才找到所有。
- 使用html表单中的参数调用JavaScript函数
- angularjs-控制器在表单提交时未调用
- 为什么我的ajax在提交用@HtmlRenderPartial加载的表单时只调用fire一次
- 如何使用javascript验证表单中的数据,然后调用php页面
- 使用jquery调用vaadin应用程序表单php
- 调用<表单>
- 在带有参数列表的表单submit上调用一个方法
- 在表单提交按钮的点击事件中调用函数时发生引用错误
- 表单提交没有'调用return false后无法工作
- '这'表单中的关键字onsubmit调用
- 如何从php中的输入表单调用Javascript函数,以更改HTML
- 无法从JS表单调用servlet doPost方法
- 从联系表单 7 调用 js 函数
- 无法从html表单调用php
- 如何使用java脚本或Jquery从表单调用spring控制器方法
- Joomla网站-有一个表单调用javascript函数-但它也重定向我的url -为什么
- 从动作表单调用jQuery
- Knockout.js无法在mvc中从html表单调用
- AJAX为HTML表单调用PHP文件无效
- HTML表单调用javascript函数