我们要求网页显示加入少数几个表的所有记录。 我们有一个“添加按钮” - 单击按钮后,我必须显示一个弹出窗口,用户将在其中输入必要的详细信息。弹出窗口将有两个按钮Save and Cancel。
单击“保存”按钮,应验证字段,如果所有验证都已通过,则将记录保存到数据库,否则在警告框中显示错误消息。
单击“取消”按钮将关闭弹出窗口。
如何在点击添加按钮时创建弹出窗口?
答案 0 :(得分:10)
您需要将服务器端(Rails,控制器,操作)和客户端(弹出窗口,JavaScript,发送请求)分开。
您的客户端操作(JavaScript代码)应该将您的Rails应用程序视为某些服务器,该服务器会为某些返回一些响应要求。从JavaScript的角度来看,服务器是运行Rails还是Smalltalk并不重要。
弹出窗口的基本工作流程可能是:
1)打开一个新窗口 - 这需要JavaScript的客户端活动。使用window.open函数,或者(我谦虚地认为这种方法更好)create a new <div>
并使用CSS设置样式以便覆盖(一个很好的效果是半透明的背景:{ {1}},您仍然可以看到该页面的内容。
2)用编辑表单填充窗口 - 这里客户端脚本应该进行类似AJAX的调用(不一定是真正的AJAX,因为在这种情况下,同步请求可能是合理的以从您的Rails应用程序获取编辑表单。看到这个简单的例子:
background: #ddf; opacity: 0.5;
3)在Rails应用程序中准备表单返回操作 - (服务器端)通常这可能是您对给定资源的function fillPopupBody(popup) {
var req = new XMLHttpRequest();
req.open("GET","/something/partial_new_form.html",false); // Synchronic request!
req.send(null);
if( req.status == 200 ) {
popup.innerHTML = req.responseText;
return true;
} else {
popup.innerHTML = "<p class='error'>"+req.status+" ("+req.statusText+")</p>";
return false;
}
}
操作控制器,但没有布局渲染。
另一种方法是通过JavaScript构建表单(无需单独获取),或者将其始终包含在页面中 - 默认情况下只是隐藏,因此JavaScript只需要设置其new
属性
4)处理表单提交 - 您可能希望用户保持在同一页面上,因此您应该拦截表单提交。只需在创建的表单的“submit”事件中添加一个处理程序,构建一个请求,发布它,检查服务器响应。
Rails将通过您的:create action 返回响应。您可能已经准备好了,因为display
创建的代码通常没问题。
如果响应为201(已创建),您可以关闭弹出窗口(./script/rails generate scaffold
)并更新页面以显示新对象 - 刷新整个页面,或仅获取更改的部分。
如果display: none
操作无法创建对象,则默认情况下响应代码为422(不可处理的实体),内容为模型错误对象,呈现为JSON或XML。只需在表单中显示错误(让JavaScript设置某些预定义元素的create
)。
这是完成任务的“手动”方式。我对JavaScript库有一些厌恶(难以解释;-),我更喜欢直接使用DOM。您可能会发现许多Rails助手可以帮助您避免编写JavaScript代码。我想,查看innerHTML
的{{1}}参数将是一个很好的起点。
jQuery文档(http://docs.jquery.com/Main_Page)也可能是一件好事。
结束这个长篇故事,以下是评论中你的问题的简短答案:
如何从弹出窗口链接控制器操作?
:通过向正确的URL发送HTTP请求:“GET / users / 1 / notes / new”,“POST / user / 1 / notes”
如何关闭弹出窗口?
:如果弹出窗口是页面的元素,则设置:remote => true
,如果弹出窗口是单独的窗口,则调用form_for
。
答案 1 :(得分:1)
我做了如下:
打开一个窗口:
<%= link_to "Agregar Modelos", {:controller => "educationals", :action => "index4", :id => params[:id]}, :popup => ['Modelo Educacional', 'height=300,width=600'] %>
提交后关闭窗口:
<%= submit_tag "Aceptar", :onclick => "window.close()" %>