首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >标记用户开始在表单中键入的时间

标记用户开始在表单中键入的时间
EN

Stack Overflow用户
提问于 2013-04-08 07:46:24
回答 4查看 826关注 0票数 4

当用户开始在表单中键入内容时,我希望将用户添加到帖子的author列表中。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-19 21:50:12

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

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

您的下一个要求是告诉服务器,“当用户在表单中键入任何字母(或按下'enter‘按钮)时”。因此,我们为"keypress“事件定义了一个事件处理程序。在按下第一个键之后,应移除此事件处理程序。感谢@user2257149提供了以下代码(我稍微调整了一下):

代码语言:javascript
运行
复制
    function typeCatch(){
      $(this).off("keypress",typeCatch) // remove handler
      console.log("User start type");
    }

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

该javascript代码片段必须<textarea>的定义之下。

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

代码语言:javascript
运行
复制
PUT http://www.example.com/posts/123/add_current_author

这意味着,我们应该使用HTTP PUT方法来更新PostsController中ID为123的post和触发器方法add_current_author。

因此,我们将函数typeCatch()调整为:

代码语言:javascript
运行
复制
function typeCatch(){
  $(this).off("keypress",typeCatch)//remove handler
  $.ajax({
    type: "POST",
    url: '/posts/123/add_current_author',
    data: JSON.stringify({_method: 'put'})
  });
}

(因为大多数浏览器不支持PUT方法,所以Ruby on Rails通过发送POST参数"_method",在他的answer to Ruby on rails - PUT method on update ajax中从@Michael Koper那里得到了这个)

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

代码语言:javascript
运行
复制
resources :posts do
  collection do
    put "add_current_author"
  end
end

现在,在您的PostsController中,您必须定义方法add_current_author。我假设您将@post实例化为before_filter中的实际post (由给定的:id标识),并将当前用户保存在current_user中。所以实际上它应该像这样简单:

代码语言:javascript
运行
复制
def add_current_author
  @post.authors.create(user_id: current_user.id)
end

虽然我必须承认,它看起来有点奇怪(这是你建议的)。我想,我在“post”和"users“之间有一个1:n的连接,称为”作者“,并执行以下操作:

代码语言:javascript
运行
复制
@post.authors << current_user

再次感谢@Micha,@user2257149和@Michael Koper。我提升了你的答案。

更新:正如bounty comment中所述,OP希望将当前的功能从“用户显示时标记为已读”更改为“当用户在注释表单中按下某个键时仅标记为已读”。

因此,目前EssayController有一个show操作,比如

代码语言:javascript
运行
复制
def show
  ...
  @essay.reader_links.create(reader_id: current_user.id)
  ...
end

应删除给定行,因为在显示@essay时不应添加当前用户。此外,我在上面定义的<textarea>是在注释表单中定义的,因此它可能如下所示

代码语言:javascript
运行
复制
<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函数one代替$("#post").on("keypress", typeCatch);

代码语言:javascript
运行
复制
function typeCatch(){
  $.ajax({
    type: "POST",
    url: '/posts/123/add_current_author',
    data: JSON.stringify({_method: 'put'})
  });
}
$("#post").one("keypress", typeCatch);
票数 3
EN

Stack Overflow用户

发布于 2013-04-09 02:27:18

您必须在第一次按下后为keypress和remove创建事件处理程序。

代码语言:javascript
运行
复制
function typeCatch(){
  $(this).off("keypress",typeCatch)//remove handler
  console.log("User start type");
}

$("$field_id").on("keypress",typeCatch)
票数 11
EN

Stack Overflow用户

发布于 2013-04-21 08:20:58

大家都忘了jQuery的$.one()函数了吗?这在功能上与先执行$.on(),然后在$.off()中执行相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15869223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档