Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails 3 jQuery标识;这";对象_Jquery_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Rails 3 jQuery标识;这";对象

Rails 3 jQuery标识;这";对象,jquery,ruby-on-rails,ruby-on-rails-3,Jquery,Ruby On Rails,Ruby On Rails 3,我的设置:Rails 3.0.9、Ruby 1.9.2、jQuery 1.6.2 HTML 轨道 comments\u controller.rb def创建 @comment=comment.new 回应待办事项|格式| format.html#new.html.erb format.js 结束 结束 create.js.erb $(“”)。在(??)之前插入; render'show_comments'返回我希望在textarea之前插入的内容。我可以使用#photo-42-9上的选择器,

我的设置:Rails 3.0.9、Ruby 1.9.2、jQuery 1.6.2

HTML

轨道

comments\u controller.rb
def创建
@comment=comment.new
回应待办事项|格式|
format.html#new.html.erb
format.js
结束
结束
create.js.erb
$(“”)。在(??)之前插入;
render'show_comments'
返回我希望在
textarea
之前插入的
内容。我可以使用
#photo-42-9
上的选择器,但该id是动态的,取决于我单击的
textarea
元素。如何在js中访问
create.js.erb中的
这个
对象

$('#newsfeed').delegate('.comment_box', 'keydown', function (event){
   if(event.keyCode == 13) {
    event.preventDefault();
    var params = { title: ..., description: ... };
    var $this = $(event.target);
    $.post('/comments', params, function(response) {
        $this.before(response);
    });
  }
});
在ruby中(我想,我不做ruby):

“”
如您所见,“this”不会传递给rb。相反,$.post函数等待rb响应,并将其粘贴到文本区域(事件目标)之前。这种方式更好,因为所有js代码实际上都在js代码中

注意:“
$(response).insertBefore($this)
”的工作原理相同

注意:如果将$this assignation移出“if”,则可以轻松检查新注释是否为空,是否与现有注释不同(
event.keyCode==13&&$this.val()!=''&$this.val()!=$this.prev().text()
)。此外,您还可以在插入“
$this.before
”之前的“
$this.val(“”)
”后面用
$this.val(“”)
清空文本区域。

在js中:

$('#newsfeed').delegate('.comment_box', 'keydown', function (event){
   if(event.keyCode == 13) {
    event.preventDefault();
    var params = { title: ..., description: ... };
    var $this = $(event.target);
    $.post('/comments', params, function(response) {
        $this.before(response);
    });
  }
});
在ruby中(我想,我不做ruby):

“”
如您所见,“this”不会传递给rb。相反,$.post函数等待rb响应,并将其粘贴到文本区域(事件目标)之前。这种方式更好,因为所有js代码实际上都在js代码中

注意:“
$(response).insertBefore($this)
”的工作原理相同


注意:如果将$this assignation移出“if”,则可以轻松检查新注释是否为空,是否与现有注释不同(
event.keyCode==13&&$this.val()!=''&$this.val()!=$this.prev().text()
)。此外,您还可以在“
$this.before
”后面的“
$this.val(“”)
”中清空文本区域插入。

无法从控制器上的创建操作访问此
,该操作以不同的作用域和不同的编程语言在服务器端执行,该操作在客户端脚本中确定

你有两个选择。您可以将选择器信息与请求一起传递,以便服务器可以确定它;或者,您可以系统地命名选择器,以便选择器能够由对象本身的属性确定

后者更简单。看起来您的表单正在照片上发布评论,例如,如果您使用

div_for @photo
要为您评论的照片生成容器,您可以始终使用以下方法访问该容器:

dom_id @photo
因此,您可以使用继承来选择要插入的文本区域

在create.js.erb中:

$(...content...).append('#<%= dom_id @photo %>')
$(...content...).insertBefore('<%= escape_javascript @selector %>')
在create.js.erb中:

$(...content...).append('#<%= dom_id @photo %>')
$(...content...).insertBefore('<%= escape_javascript @selector %>')
$(…内容…).insertBefore(“”)

无法通过控制器上的创建操作访问此
,该操作以不同的作用域和不同的编程语言在服务器端执行,该操作在客户端脚本中确定

你有两个选择。您可以将选择器信息与请求一起传递,以便服务器可以确定它;或者,您可以系统地命名选择器,以便选择器能够由对象本身的属性确定

后者更简单。看起来您的表单正在照片上发布评论,例如,如果您使用

div_for @photo
要为您评论的照片生成容器,您可以始终使用以下方法访问该容器:

dom_id @photo
因此,您可以使用继承来选择要插入的文本区域

在create.js.erb中:

$(...content...).append('#<%= dom_id @photo %>')
$(...content...).insertBefore('<%= escape_javascript @selector %>')
在create.js.erb中:

$(...content...).append('#<%= dom_id @photo %>')
$(...content...).insertBefore('<%= escape_javascript @selector %>')
$(…内容…).insertBefore(“”)

如果您将id与标题、描述一起作为帖子的参数传递,怎么样?我想可以,但我希望在
create.js.erb
中很容易获得
这个
对象?刚刚想起一种更方便的方法,我的答案在下面更新。如果您将id作为帖子的参数传递,怎么样,除了标题、描述?我想我可以,但我希望在
create.js.erb
中很容易获得
这个
对象?刚刚想起了一种更方便的方法,下面更新了我的答案。你的解决方案有效,我同意,它在某种程度上更干净。我突然想到,这是否应该是首选的方法,也就是说,尽量让JS代码保持在JS中并脱离轨道。有几个问题,为什么我不能使用
$(this)
而不必执行
var$this=$(event.target)
?另外,JS没有正确呈现Rails的转义JS输出,是否有JS调用来处理这个问题?您不能直接使用“$(this)”,因为“this”指的是事件本身(keydown),而不是keydown的目标。但是,目标包含在事件中,可通过“event.target”访问。实际上,目标(您的“this”)被传递给“delegate”函数(或者,click,bind,等等),而“delegate”函数不通过回调函数(我们编写的回调函数)传递它。关于轨道输出的渲染,我真的帮不了你。您是否尝试了
$this.before(unescape(response))?谢谢您的解释。我以前尝试过
unescape
,但运气不好,谢谢你的尝试。你的解决方案有效,我同意,它在某种程度上更干净。我突然想到,这是否应该是首选的方法,也就是说,尽量让JS代码保持在JS中并脱离轨道。有几个问题,为什么我不能使用
$(this)
而不必执行
var$this=$(event.target)
?JS也没有正确渲染转义