Ruby on Rails - 运行 Ruby File.open 仅当 link 被点击时

Ruby on Rails - run Ruby File.open only when link is clicked

在我的应用程序中,我有一个 link_to 用于投票目的。如果 user_signed_in? 与否,这个 link_to 会做不同的事情。

当用户 IS 登录时,他们可以投票,否则会打开一个模式供他们注册或登录

我想要实现的是计算有多少用户点击投票按钮但因为注册而没有投票。

我想做一个简单的 ruby 操作,并为每次点击添加 1date

这是我的link:

= link_to_unless has_voted?(@image.id, 1), (image_tag 'vote/thumb-up.png'),user_signed_in?? vote_image_path : File.open("public/count.txt", "a+") { |file| file.puts ([1, Date.today]).join }, data: {target: user_signed_in?? "" : "#login-modal", toggle: user_signed_in? ? "" : 'modal'}, remote: true

用户登录时一切正常,但当我想 运行 时: File.open("public/count.txt", "a+") { |file| file.puts ([1]).join } 是当事情出错的时候。

这会添加数字,但不是仅在单击 link_to 时才向 count.txt 文件添加数字,它还会为每个 添加 1 visit/refresh.

link_to点击而不是每个visit/refresh时,我怎样才能让File.open("public/count.txt", "a+") { |file| file.puts ([1]).join }只运行运行 29=]

我一直在考虑制作一个 route 并在那里添加 function 并重定向回来,但是我无法打开注册模式,同时我不想刷新页面并向用户发送来回。

在我看来它很适合 server-generated JavaScript responses

总结概念:

  • 创建一个 link 触发对服务器的 AJAX 请求(使用 link_toremote: true
  • 让服务器决定是计票还是增加已投票但未登录的计数器并显示模态。以此为基础生成相应的JavaScript,在客户端执行
  • 客户端收到JavaScript响应并执行

由您决定模态功能是否已经从一开始就加载并且服务器只是 returns showLoginModal(); 或者服务器响应是否包含整个 JavaScript 来创建模态.