如何同时呈现页面并将我的自定义数据传输到浏览器。据我了解,它需要发送两层:第一层是模板,第二层是 JSON 数据。我想通过主干处理这些数据。
我从教程中了解到 express 和 bb app 交互如下:
res.render 向浏览器发送页面document.ready触发jQuery.get到app.get('/post') app.get('/post', post.allPosts) 发送数据到页面这是三个步骤,如何一步完成?
var visitCard = {
name: 'John Smit',
phone: '+78503569987'
};
exports.index = function(req, res, next){
res.render('index');
res.send({data: visitCard});
};
我应该如何在页面上捕获这个变量 - document.card?
最佳答案
我创建了自己的小中间件函数,它向 res 对象添加了一个名为 renderWithData 的辅助方法。
app.use(function (req, res, next) {
res.renderWithData = function (view, model, data) {
res.render(view, model, function (err, viewString) {
data.view = viewString;
res.json(data);
});
};
next();
});
它包含 View 名称、 View 模型以及您要发送到浏览器的自定义数据。它调用 res.render 但传入一个回调函数。这指示 express 将编译后的 View 标记作为字符串传递给回调,而不是立即将其传递到响应中。获得 View 字符串后,我将其作为 data.view 添加到数据对象中。然后我使用 res.json 将数据对象发送到浏览器并完成编译 View :)
上面的一个警告是,请求需要使用 javascript 进行,因此它不能是整页请求。您需要一个初始请求来拉下包含将发出 ajax 请求的 javascript 的主页。
这对于当用户通过 AJAX 导航到新页面时尝试更改浏览器 URL 和标题的情况非常有用。您可以将新页面的部分 View 连同页面标题的一些数据一起发送回浏览器。然后,您的客户端脚本可以将部分 View 放在页面上它所属的位置,更新页面标题栏,并在需要时更新 URL。
如果您想将一个完整的 HTML 文档连同一些初始 JavaScript 数据一起发送到浏览器,那么您需要将该 JavaScript 代码编译到 View 本身中。这样做绝对有可能,但我从来没有找到不涉及一些字符串魔法的方法。
例如:
// controller.js
var someData = { message: 'hi' };
res.render('someView', { data: JSON.stringify(someData) });
// someView.jade
script.
var someData = !{data};
注意:使用 !{data} 代替 #{data} 因为jade默认会转义 HTML,这会将所有引号转换为 " 占位符。
一开始看起来很奇怪,但它确实有效。基本上,您在服务器上获取一个 JS 对象,将其转换为字符串,将该字符串呈现到编译后的 View 中,然后将其发送到浏览器。当文档最终到达浏览器时,它应该如下所示:
// someSite.com/someView
<script type="text/javascript">
var someData = { "message": "hi" };
</script>
希望这是有道理的。如果我要重新创建我原来的辅助方法来减轻第二种情况的痛苦,那么它看起来像这样:
app.use(function (req, res, next) {
res.renderWithData = function (view, model, data) {
model.data = JSON.stringify(data);
res.render(view, model);
};
next();
});
所有这一切都是获取您的自定义数据对象,为您将其字符串化,将其添加到 View 的模型中,然后正常渲染 View 。现在你可以调用 res.renderWithData('someView', {}, { message: 'hi' });;您只需确保在 View 中的某个位置抓取该数据字符串并将其呈现为变量赋值语句。
html
head
title Some Page
script.
var data = !{data};
不会撒谎,这整件事感觉有点恶心,但如果它为您节省了一次额外的服务器之旅,而这就是您所追求的,那么这就是您需要做的事情。也许有人可以想出一些更聪明的方法,但我只是不明白如何才能让数据已经出现在第一次呈现的完整 HTML 文档中。
这是一个工作示例:https://c9.io/chevex/test
您需要拥有一个(免费)Cloud9 帐户才能运行该项目。登录,打开 app.js,然后点击顶部的绿色运行按钮。
关于javascript - Express - 在单个请求中向浏览器发送页面和自定义数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21172889/
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b