标记用户何时开始键入表单

时间:2013-04-07 23:46:24

标签: javascript ruby-on-rails ajax jquery

当用户开始在表单中输入时,我想将用户添加到帖子的author列表中。

例如,当用户在表单中键入任何字母(或按“输入”按钮)时,我会调用@post.authors.create(user_id: current_user.id)将用户添加到该特定帖子的作者列表中。我认为这是不可能实现的,但使用javascript提交ajax请求可能足以实现此方法。是否有可能在Rails应用程序中实现此类方法?如果是这样,有人可以给我一些指示吗?

4 个答案:

答案 0 :(得分:11)

您必须为按键创建事件处理程序并在首次按下后删除。

function typeCatch(){
  $(this).off("keypress",typeCatch)//remove handler
  console.log("User start type");
}

$("$field_id").on("keypress",typeCatch)

答案 1 :(得分:3)

对于以下答案,我假设您使用jQuery作为javascript框架运行Ruby on Rails并且让当前用户(= author)登录(即会话中的当前用户ID)。我正在解释@Mischa的想法:使用按键事件。

因此,正如您所解释的那样,您有一个表单来编辑帖子。我猜你里面有一个文本区域,里面有帖子的文字。例如<textarea id="posting">This is a post</textarea>

您的下一个要求是告诉服务器&#34;当用户键入任何字母(或按下&#39;输入&#39;按钮)时,表格为#34;。因此,我们为&#34; keypress&#34;定义了一个事件处理程序。事件。按下第一个键后,应删除此事件处理程序。感谢@ user2257149获取以下代码(我稍微调整了一下):

    function typeCatch(){
      $(this).off("keypress",typeCatch) // remove handler
      console.log("User start type");
    }

    $("#post").on("keypress",typeCatch); // add handler

此javascript代码片段必须低于<textarea>的定义。

现在我们有一个只触发一次的事件处理程序。在这个处理程序中,我们触发ajax调用让服务器知道,当前用户正在编辑当前帖子。当我们更新post对象中的特定属性时,我们应该触发类似以下URL的内容:

PUT http://www.example.com/posts/123/add_current_author

这意味着,我们应该使用HTTP PUT 方法更新ID 123 的帖子,并在{{1}中触发方法 add_current_author }。

因此我们将函数PostsController调整为:

typeCatch()

(由于大多数浏览器不支持PUT方法,Ruby on Rails通过发送POST参数&#34; _method&#34;来欺骗我,我从@Michael Koper那里得到了answer to Ruby on rails - PUT method on update ajax

您可能需要将此特殊路由添加到Ruby on Rails(不确定以下内容,我的rails有点生锈):

function typeCatch(){
  $(this).off("keypress",typeCatch)//remove handler
  $.ajax({
    type: "POST",
    url: '/posts/123/add_current_author',
    data: JSON.stringify({_method: 'put'})
  });
}

现在,在resources :posts do collection do put "add_current_author" end end 中,您必须定义方法PostsController。我假设您将add_current_author实例化为@post中的实际帖子(由给定:id标识),并将您当前的用户保存在before_filter中。实际上它应该像以下一样简单:

current_user

虽然我必须承认,它看起来有点奇怪(它是你的建议)。我想,我在&#34;帖子&#34;之间有一个1:n的联系。和&#34;用户&#34;叫做作者&#34;并执行以下操作:

def add_current_author
  @post.authors.create(user_id: current_user.id)
end

再次感谢@Micha,@ user2257149和@Michael Koper。我赞成你的答案。

<强>更新 正如赏金评论中所述,OP希望更改当前功能,以及#34;用户在显示时标记的标记&#34;当用户按评论表格#34;。

按键时,只标记为已读

目前@post.authors << current_user 有一个EssayController动作,如

show

应删除给定的行,因为显示def show ... @essay.reader_links.create(reader_id: current_user.id) ... end 时不应添加当前用户。此外,我在上面定义的@essay是注释表单中的<textarea>,因此HTML可能看起来像

<html>
  ...
  <form action="essay/123/comment" method="post">
    ...
    <textarea name="comment_text" id="comment"></textarea>
    ...
  </form>
  <script type="text/javascript">
    function typeCatch() {
      ...
    }
    $("#post").on("keypress", typeCatch);
  </script>
</html>

最后,行动add_current_author不应该像我假设的那样,在PostController但在EssayController中并且路线分别改变。

更新2: 正如@Yarek T所说,可以使用jQuery函数$("#post").on("keypress", typeCatch);代替one

function typeCatch(){
  $.ajax({
    type: "POST",
    url: '/posts/123/add_current_author',
    data: JSON.stringify({_method: 'put'})
  });
}
$("#post").one("keypress", typeCatch);

答案 2 :(得分:1)

大家都忘记了jQuery的$.one()功能吗?其功能与执行$.on()相同,然后在$.off()内。

答案 3 :(得分:0)

var flag = 0;
$(document).on('keypress', function(e) {
    if(flag == 0) {
         doSomething();
         flag = 1;
    }   
});