小编Kar*_*lis的帖子

Rails在请求的参数中将空数组转换为nils

我的应用程序中有一个Backbone模型,它不是一个典型的扁平对象,它是一个大型嵌套对象,我们将嵌套部分存储在MySQL数据库的TEXT列中.

我想在Rails API中处理JSON编码/解码,以便从外部看起来你可以POST/GET这个大的嵌套JSON对象,即使它的一部分存储为字符串化的JSON文本.

但是,我遇到了一个问题,Rails神奇地将空数组转换为nil值.例如,如果我发布这个:

{
  name: "foo",
  surname: "bar",
  nested_json: {
    complicated: []
  }
}
Run Code Online (Sandbox Code Playgroud)

我的Rails控制器看到了这个:

{
  :name => "foo",
  :surname => "bar",
  :nested_json => {
    :complicated => nil
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我的JSON数据已经改变了..

有没有人遇到过这个问题?为什么Rails会修改我的POST数据?

UPDATE

这是他们这样做的地方:

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/request.rb#L288

这是〜为什么他们这样做:

https://github.com/rails/rails/pull/8862

所以现在的问题是,如何在我的嵌套JSON API情况下最好地处理这个问题?

json ruby-on-rails

59
推荐指数
3
解决办法
2万
查看次数

由DOM和HTML(API)之间的关系混淆

DOM和HTML如何相关?是另一个的子集,是一个比另一个更抽象的概念吗?HTML是DOM的扩展吗?或者它们是否描述了相当不相关的概念(仅与您可以从HTML转换为DOM相关)?如果必须的话,你会如何在一张照片中画出这两张?

例如,这些差异规范的目的是什么.第一个和最后一个链接都包含有关HTMLElement的信息.

  1. http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/
  2. http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/
  3. http://www.w3.org/TR/html5/

我在这里找到了这个问题的可能答案:http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-1176245063-h2,这是

HTML特定DOM API的目标是:

  • 专门化和添加专门与HTML文档和元素相关的功能
  • ...
  • 在适当的情况下为HTML文档的常见和频繁操作提供便利机制.

这是否意味着上面列表中的第3个链接扩展了DOM Core,这在第1个链接中有描述?

或者如果你实现了DOM Core,它允许你操作简单的文档,但是如果你实现了HTML,那么你就像一个超级DOM,可以让你操作更复杂的对象?

最后,假设你想要实现自己的浏览器,只能打开HTML5网站(渲染,以及支持JavaScript).是否足以阅读第3个链接中的规范,或者您是否首先需要实现DOM中提供的所有内容然后实现HTML5特定的东西?

更新
我想我想知道DOM API vs HTML API与DOM HTML API和HTML DOM API.

html browser w3c dom

14
推荐指数
4
解决办法
7662
查看次数

避免var _this = this; 在编写jQuery事件处理程序时

这不是一个非常重要的问题,但我们走了......

你如何避免在jQuery事件处理程序中使用var _this = this?即我不喜欢这样做:

var _this = this;
$(el).click(function (event) {
  //use _this to access the object and $(this) to access dom element
});
Run Code Online (Sandbox Code Playgroud)

以下两种方式并不理想

$(el).click($.proxy(function (event) {
  //lost access to the correct dom element, i.e. event.target is not good enough (see http://jsfiddle.net/ne3n3/1/)
}, this));

$(el).click({_this: this}, function (event) {
  //have access to $(this) and event.data._this, but it seems too verbose
})
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想做点什么

$(el).click(function (event) {
  this.method(); // this is accessing the object
  event.realTarget; // this is accessing the …
Run Code Online (Sandbox Code Playgroud)

javascript syntax jquery

6
推荐指数
1
解决办法
3199
查看次数

反应套接字SO_ERROR的本机无尽流

我正在一个现有的React Native项目上,在XCode日志输出中,我得到了以下错误的源源不断

2019-01-09 12:15:49.005630+0000 App [13746:3543026] [] nw_socket_handle_socket_event [C10.1:1] Socket SO_ERROR [61: Connection refused]
2019-01-09 12:15:49.016640+0000 App [13746:3543026] [] nw_socket_handle_socket_event [C10.2:1] Socket SO_ERROR [61: Connection refused]
2019-01-09 12:15:49.017800+0000 App [13746:3543010] [] nw_connection_get_connected_socket [C10] Client called nw_connection_get_connected_socket on unconnected nw_connection
Run Code Online (Sandbox Code Playgroud)

我该如何找出错误的出处?它似乎并没有影响应用程序,但我想了解这个问题。我怀疑这不是应用程序的JavaScript代码,而是所使用的pod之一:

pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'Firebase/Crash'
Run Code Online (Sandbox Code Playgroud)

xcode react-native react-native-ios

6
推荐指数
1
解决办法
3292
查看次数

Yii中模块内的小部件

我正在尝试在模块中创建一个小部件,然后从模块的"外部"加载该小部件.更具体地说,我正在使用其他人编写的用户模块.我不想有一个单独的页面来显示登录表单,因此我尝试制作一个显示登录表单的CPortlet/widget(混淆).基本上,我已经将LoginController中的代码移动到该小部件中.然后我尝试在一些随机页面上显示小部件

<?php $this->widget('user.components.LoginForm'); ?>
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误

CWebApplication does not have a method named "encrypting".
Run Code Online (Sandbox Code Playgroud)

在此行的UserIdentity类中:

else if(Yii::app()->controller->module->encrypting($this->password)!==$user->password)
Run Code Online (Sandbox Code Playgroud)

发生这种情况,因为我基本上试图在应用程序的上下文中执行此代码,而不是模块.因此,"Yii :: app() - > controller-> module"技巧并没有按预期工作.

  1. 我究竟做错了什么:-\
  2. 有没有更好的方法来实现这一目标.即在其他页面中显示登录表单,通常通过访问用户模块中的登录控制器(用户/登录)来显示,或者是正确的方式进行小部件操作?

谢谢.

php yii

5
推荐指数
1
解决办法
9119
查看次数

使用套接字进行进程间通信的限制是什么?

我正在创建一个Firefox扩展,允许在Firefox中使用Standard ML(SML)作为客户端编程语言.它的工作方式如下:

  1. 该扩展启动了PolyML进程(具有顶级交互式shell的SML编译器).
  2. 然后在扩展和PolyML过程之间建立套接字通信.
  3. 从网页读取SML代码,并通过套接字发送到PolyML流程进行评估.
  4. 然后,该代码可以使用我提供的库来处理DOM.

以下是DOM库的实现方式:

  1. 假设有人执行SML函数DOM.getElementById
  2. 此请求通过套接字转发到扩展,扩展在页面上执行JavaScript函数getElementById,并通过套接字将结果发送回PolyML进程.

我的问题是,理论上,在套接字通信方面,我应该期待在性能方面有什么限制?

我做了一些非常近似的分析,似乎在扩展和PolyML之间使用这个接口,我可以大约发送2500条消息/秒,平均大小为70字节/消息.

为了说明这一点,我想在浏览器中使用Canvas元素绘制一些动画.如果我想达到20fps,这意味着我需要在0.05秒内绘制每一帧,这意味着我每帧只能发送大约125条消息.这些消息对应于JavaScript函数调用.例如,下面的代码绘制一个路径并进行9次JavaScript函数调用,这些调用对应于套接字通信中的9条消息.

val _ = Canvas.beginPath context;
val _ = Canvas.setFillStyle context fillColor;
val _ = Canvas.setStrokeStyle context fillColor;
val _ = Canvas.setLineWidth context size;
val _ = Canvas.moveTo context posx posy;
val _ = Canvas.lineTo context posx_new posy_new;
val _ = Canvas.stroke context;
val _ = Canvas.arc context posx_new posy_new (size/2.0) 0.0 6.28 true;
val _ = Canvas.fill context;
Run Code Online (Sandbox Code Playgroud)

显然,JavaScript有更好的性能,我想你可以在0.05秒内完成数千(数百)次Canvas/DOM函数调用,用于绘制帧.

所以,我想我的问题是,您是否有使用套接字通信进行非常快速的消息交换的经验.我想知道2500条小信息/秒(在这种情况下,相当于150千字节/秒)是否正确或者我可能做错了什么.

例如,有人怀疑firefox中的套接字实现(特别是通过JavaScript接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互并不是很好.例如,从套接字读取是通过事件循环机制完成的.那就是我依靠Firefox ..来通知我有关传入套接字消息的可用性,有时在发送消息和接收它之间有一个很大的(例如250ms)延迟(虽然这似乎只有在firefox忙于做的时候才会发生其他的事情,我对套接字通信的理论限制更感兴趣 …

sockets firefox sml firefox-addon interprocess

5
推荐指数
1
解决办法
1213
查看次数

可点击的道场标签

如果您正在使用dojo表单输入并希望为它们添加标签:

<label for="???">Email</label>
<input
  type="text"
  name="email"
  dojoAttachPoint="email"
  dojoType="dijit.form.TextBox"
/>
Run Code Online (Sandbox Code Playgroud)

标签不可点击,因为在呈现之前无法知道输入的ID.

除了在dojo中为该元素生成id之外,是否存在解决方案?

UPDATE

它实际上比我想象的要困难得多,因为dojo中的输入字段被渲染为

<div class="dijit dijitTextBox" id="widget_dijit_form_TextBox_0">
  <input class="dijitReset dijitInputField" value="?" type="text" tabindex="-1">
  ...
</div>
Run Code Online (Sandbox Code Playgroud)

并且基础输入字段没有id

javascript dojo

5
推荐指数
1
解决办法
2270
查看次数

是使用document.write唯一可能的方式来跨浏览器跨域同步加载脚本?

我想模仿这种行为:

<script src="console.log.1.js"></script>
<script>console.log(2)</script>
<script>console.log(3)</script>
Run Code Online (Sandbox Code Playgroud)

注销:

1
2
3
Run Code Online (Sandbox Code Playgroud)

这样做不起作用:

<script>
var x = document.createElement("script");
x.src = "console.log.1.js";
x.async = false;
x.defer = false;
document.body.appendChild(x);
console.log("2");
console.log("3");
</script>
Run Code Online (Sandbox Code Playgroud)

它注销:

2
3
1
Run Code Online (Sandbox Code Playgroud)

到目前为止我发现的唯一方法是实现它:

<script>
document.write("<scrip" + "t src='console.log.1.js'></scrip" + "t>");
</script>
<script>
console.log("2");
console.log("3");
</script>
Run Code Online (Sandbox Code Playgroud)

这是否是在所有浏览器中强制同步加载外部脚本的唯一方法?为什么不设置async = false,defer = false工作?

UPDATE

仅供参考,如果有人想知道,以下document.write开始有效(在Chrome中):

<script>
  // http://jsbin.com/avatiw logs "during"
  document.write('<scrip' + 't>console.log("before");document.write("<scrip" + "t src=\\"http://jsbin.com/avatiw\\"></scrip" + "t>");</scrip' + 't>');
  document.write('<scrip' + 't>console.log("after");</scrip' + 't>');
</script>
Run Code Online (Sandbox Code Playgroud)

工作和注销:

"before"
"during"
"after"
Run Code Online (Sandbox Code Playgroud)

javascript browser cross-browser

1
推荐指数
1
解决办法
1778
查看次数