【问题标题】:Rails 3 - Increment Model Data on click to a link_toRails 3 - 点击链接增加模型数据
【发布时间】:2026-02-21 21:15:01
【问题描述】:

我正在开发一个小型图片应用程序。我正在尝试做的是建立一个计数器来跟踪每个图像被点击的次数。

现在我认为:

<% @galleries.each do |g| %>
    <% for image in g.images %>
    <div id="picture">
      <%= render 'top_nav'%>

      <%= link_to g.source, :target => true do %>
        <%= image_tag image.file_url(:preview) %>
        <% g.vote %>
      <% end %>

      <%= will_paginate(@galleries, :next_label => "Forward", :previous_label => "Previous") %>
    </div>

显然这不起作用,因为 g.vote 每次呈现时都会执行,而不是单击。这是我的模型中的投票方法:

def vote
    self.increment!(:score)
end

我正在寻找仅在单击上图时才运行投票方法的解决方案。这些链接仅指向外部资源,而不是显示操作。我是否应该构建一个控制器操作来接受帖子、执行投票,然后重定向到源?

无论如何,正在寻找一些想法,谢谢。

【问题讨论】:

  • 您可以按照您的建议执行 onClick 事件,该事件会触发对您的投票操作的 ajax 调用。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

我也做过类似的事情,但会记录下载链接被点击的次数。这是不久前的事,当时我还不了解 Ajax,但现在我建议使用 jQuery(我认为这是一个很棒的库,但你可以使用其他东西)并在单击图像时进行 Ajax 调用执行一些控制器动作来增加投票。

另一种方式,这就是我在我的场景中所做的,也就是你在那里所说的,是在接受帖子的控制器中创建一个自定义操作。但我也不得不问,点击图片是否会对您网站的行为产生其他影响?例如,如果当您单击图片时,应该会出现另一个随机图像,这意味着您已经有一个加载新图像的操作,并且在显示新图像之前很容易将投票粘贴在那里。否则,您必须创建新的控制器操作。如果是这种情况,Ajax 会更有效,因为用户在页面刷新时不会看到瞬间闪烁(如果刷新时间很长,则尤其糟糕)。

【讨论】:

  • 我已经通过 jQuery 成功地将链接更改为 Ajax 链接,因为没有任何操作,该链接没有任何操作只是超链接到外部源。但是问题是,对于访问模型方法(以增加我的分值),应该在 application.js 中进行而不是在 index.js.erb 中正确吗?
  • 就个人而言,我喜欢将 JS 称为 picture.js(如果它用于 Picture 模型),因为我也非常喜欢组织文件。无论如何,RoR 有时会让你这样做:picture.rb、picture_test.rb、pictures_controller.rb 等。组织最终取决于你,但这是我的建议。只需记住将您的 JS 文件显式添加到您的视图或应用程序布局文件中。