您需要将服务器端(Rails、控制器、操作)和客户端(弹出窗口、JavaScript、发送请求)分开。
您的客户端操作(JavaScript 代码)应该将您的 Rails 应用程序视为some服务器,返回some的回应some要求。从 JavaScript 的角度来看,服务器运行的是 Rails 还是 Smalltalk 并不重要。
弹出窗口的基本工作流程可能是:
1)打开一个新窗口- 这需要客户端JavaScript 的活动。使用窗口.打开 https://developer.mozilla.org/en/DOM/window.open函数,或者(我谦虚地认为这种方法更好)创建一个新的 https://developer.mozilla.org/en/DOM/document.createElement <div>
并使用 CSS 对其进行样式设置,使其覆盖(半透明背景是一个很好的效果:background: #ddf; opacity: 0.5;
,通过它您仍然可以看到页面的内容)。
2)用编辑表单填充窗口- 这是你的客户端脚本应该进行类似 AJAX 的调用(不一定是真正的 AJAX,因为在这种情况下同步请求可能是明智的)从 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;
}
}
3) 在 Rails 应用程序中准备表单返回操作 - (服务器端)通常这可能是你的new
给定资源控制器的操作,但在没有布局的情况下呈现。
另一种方法是通过 JavaScript 构建表单(无需单独获取),或者始终将其包含在页面中 - 默认情况下隐藏,因此 JavaScript 只需要设置其display
财产。
4)处理表单提交- 您可能希望用户留在同一页面上,因此您应该拦截表单提交。只需将处理程序添加到创建的表单的“提交”事件中,构建请求,发布请求,检查服务器响应。
The Rails 将通过您的 :create 操作返回响应。您可能已经准备好了,因为创建的代码./script/rails generate scaffold
通常是可以的。
如果响应是 201(已创建),您可以关闭弹出窗口(display: none
)并更新页面以显示新对象 - 刷新整个页面,或仅获取更改的部分。
If the create
操作无法创建对象,默认情况下响应代码为 422(无法处理的实体),内容是模型错误对象,呈现为 JSON 或 XML。只需在表单中显示错误(让您的 JavaScript 设置innerHTML
一些预定义元素)。
这是执行任务的“手动”方式。我对 JavaScript 库有一些厌恶(很难解释;-),而且我更喜欢直接使用 DOM。您可能会发现很多 Rails 助手,它们可以帮助您免去编写 JavaScript 代码的麻烦。我想看着:remote => true
的参数form_for
将是一个很好的起点。
还有 jQuery 文档 (http://docs.jquery.com/Main_Page http://docs.jquery.com/Main_Page)可能是一件值得阅读的好东西。
结束这个漫长的故事,以下是short从评论中回答你的问题:
如何从弹出窗口链接控制器操作?
:通过向正确的 URL 发送 HTTP 请求:“GET /users/1/notes/new”、“POST /user/1/notes”
我如何关闭弹出窗口?
: 通过设置display: none
如果弹出窗口是页面的一个元素,或者通过调用window.close()
如果您的弹出窗口是一个单独的窗口。