【问题标题】:How can I use jQuery to update a field on my rails model?如何使用 jQuery 更新我的 rails 模型上的字段?
【发布时间】:2013-09-22 09:13:34
【问题描述】:

我有一个模型 Player,它有一个字段 total_points。

在我的主页上,我有球员姓名和总积分:

<div id="player1">
  <h3><%= "#{@player1.first_name} #{@player1.last_name} (#{@player1.total_points})" %></h3>
</div>

我想让@player1 上的 total_points 字段在用户每次点击玩家的名字时增加 1。到目前为止,我的 jQuery (coffeescript) 是:

/home.js.coffee
jQuery ->
  pointForPlayer1 = (e) ->
    e.preventDefault()
    console.log('player 1 clicked')

  $('#player1').click pointForPlayer1

这有效(如,它将消息记录到控制台),但我不确定如何让点击增加 @player1.total_points 1,然后重新呈现上面的消息(最好不重新加载整个页)。谢谢!

【问题讨论】:

    标签: jquery ruby-on-rails coffeescript


    【解决方案1】:

    如果您调整您的 HTML 以便您可以轻松找到总分,您将有一个更好的时间。像这样的:

    <div id="player1">
      <h3>
        <%= "#{@player1.first_name} #{@player1.last_name}" %>
        (<span class="total"><%= @player1.total_points %></span>)
      </h3>
    </div>
    

    那么您可能希望控制服务器端来增加玩家的总分并发回新的总分。那会给你留下这样的东西:

    $ ->
      $('#player1').click (e) ->
        e.preventDefault()
        $.post 'whatever-the-url-is', (new_total) ->
          $('#player1 .total_points').html(new_total)
    

    如果您没有在服务器上存储任何内容,那么您可以这样做:

    $ ->
      $('#player1').click (e) ->
        e.preventDefault()
        $t = $('#player1 .total_points')
        $t.html(parseInt($t.html(), 10) + 1)
    

    【讨论】:

    • 谢谢,这真的很有帮助!快速跟进问题:我在 url 调用的控制器操作中使用什么来引用 new_total?我已经尝试过 params[:new_total] 并且它为零。再次感谢?
    • 这取决于你如何调用$.post,通常你说$.post 'some-url', data, callback,其中data 将是在你的控制器中以params 结尾的对象。所以你在 CoffeeScript 中使用的data 决定了你如何解释params。此外,您不会将新总数发送到服务器,服务器只会将单个列增量向下发送到数据库,将新总数从数据库中拉出,然后将其发送回。
    • 感谢您的反馈,但我对此很陌生,我认为这超出了我的想象。我上面包含的是我真实代码的简化版本。我的真实数据对象现在包含在上面。您能否提供一个示例,说明我将如何在控制器中访问它?
    • 我在您的问题中没有看到任何新内容。基本上,你有一个到config/routes.rb 的路由,然后是那个路由的控制器方法(这只不过是一个increment_counter 调用),然后从数据库中加载总数,并将其作为响应发送回来。
    • 这取决于路线。你可能有一个/player/:id/add_point 或类似的 POST 路由,然后id 就在 URL 中,你可以$.post "/player/#{id}/add_point" 其中id 是保存玩家@ 的本地(CoffeeScript)变量987654338@.
    【解决方案2】:

    由于您选择使用 jquery(我认为这可能是计算时代最伟大的发明 :)),这相对容易。

    您需要使用 post 命令,该命令将使用 AJAX 回传到您的应用程序。因此,在您的情况下,咖啡脚本将是 $('#player1').click -> $.post(route, data, success method, datatype) per the JQuery docs

    success 方法然后可以获取返回数据并进行处理。如果此时您的 html 发生更改,您可以返回 html 并将相应的 html 块替换为 JQuery。您还可以根据需要返回 JSON、XML 等。我认为在这种情况下,听起来返回一大块 html 可能是合适的。您需要一个合适的视图来进行渲染。

    【讨论】:

    • 谢谢!当我在 url 调用的控制器操作中时,我使用什么来引用我传递的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多