【问题标题】:Ruby on Rails - AJAX - div problemRuby on Rails - AJAX - div 问题
【发布时间】:2010-12-18 18:30:33
【问题描述】:

我是 Rails 新手,所以请放轻松。我已经建立了一个博客,并且正在尝试向 /posts/index.html.erb 页面添加“投票”类型的功能。有点像 Facebook 的点赞功能。我已经可以成功地使投票表起作用。我已经成功地通过 调用。这是我遇到问题的地方。然后我告诉 index,在上面,也为每个帖子呈现投票表单,并且 显示每个帖子的总票数并允许为每个帖子提交表单。我正在使用 AJAX 让这一切一起工作。

由于我的 /votes/create.js.rjs 的工作方式,它会将结果发送到 div id="votes",并在 我将 包裹在 votes div 标签中。但是create.js.rjs在发送数据的时候,只会更新渲染的html页面上的第一个div标签。

因此,如果您可以想象,就像在 facebook 上一样,当您单击您喜欢的内容时,更新不会发生在您刚刚单击的帖子上,而是返回到另一个帖子的页面顶部,即第一个帖子。投票计数由您单击的元素表示,但记录错误。

代码如下:

POSTS/INDEX.HTML.ERB

<% @posts.each do |post| %>
  <%= render :partial => post %>
  <%= render :partial => @post %>
 <div id="beltcomments">
  <div id="beltcommenttext">
    <div id="votebutton">
    <% remote_form_for [ post, Vote.new] do |f| %>
    <%= f.hidden_field :vote, :value => '1' %>
    <%= submit_tag '', :class => 'voteup' %>

    </div>
   <div id="vote"><br/>

     <%= post.votes.count %> People like the above BattleCry. <br/>

    <%= link_to "Comments (#{post.comments.count})", post %>
   </div>

   </div>
</div>

<br/>
<br/>
<br/>
<br/>

<% end %>
<% end %>

<div id="commenttime">
Copyright 2009, My Life BattleCry, LLC. 
</div>

/POSTS/CREATE.JS.RJS

page.replace_html  :votes, :partial => @vote
page[@vote].visual_effect :highlight

/POSTS/_VOTE.HTML.ERB

<% div_for vote do %>
  <%= @post.votes.count %> with your vote. Awesome!!!
  <div id="commenttime">
   Thanks for your vote. <br/>
   </div>

 <% end %>

【问题讨论】:

    标签: ruby-on-rails ruby ajax blogs


    【解决方案1】:

    首先检查实际呈现的 html 以查看每个元素是否有唯一的 id。如果不是(并且有多个元素具有相同的 id),JS 将默认更新列表中的第一个元素。您将需要以某种方式唯一标识要更新的元素。你总是可以做一个简单的

    <% @posts.each_with_index do |post, i| %>
    

    然后用

    标记每个元素
    <%= f.hidden_field "vote-#{i}", :value => '1' %>
    

    然后将i 传递给您的 rjs,以便它知道它正在更新哪个字段的计数。

    【讨论】:

    • 这正是正在发生的事情。我想我可能会在上面的位置提供更多导航帮助。例如,我是否替换当前的 使用上面的代码,还是我在下面添加它?此外,我是否必须更改 /votes/create.js.rjs 以表示“vote-#{i}”以及正确的语法是什么。最后,我是否需要在 votes_controller.rb 中添加一些东西来通过你所说的?我希望有什么东西可以做到这一点。谢谢,如果可以的话,请告诉我。
    • 正确,您将替换当前的 。正确,您需要签入 rjs 以查找类似“vote-#{i}”的内容(但请先查看下一段)。正确,您需要将其传递给控制器​​,以传递给 rjs。这可以通过向 form_remote_for 添加 :with => i 或创建另一个隐藏字段来为每个 div 保存 i 的值来实现。然后它将与表单一起提交,您只需使用 "vote-#{params[: i]}" 获取值
    【解决方案2】:

    我不完全理解这个问题。你是说当你点击投票时,它会更新错误帖子的计数?

    假设是这种情况,我认为您的问题是您没有唯一标识 html 中的每个帖子。旁注,那些 div 等应该是类,那不是有效的 html。无论如何,您希望每个帖子都有一个具有唯一标识 ID 的 div,例如 post_1、post_2 等,并且应该与您的 ajax 请求一起发送,以便响应知道要更新哪个 div。

    这里有一个提示,与您的问题无关,是将整个循环放入部分循环并使用 :collection 呈现它。生成更好的代码。

    【讨论】:

    • 感谢您的提示。卢卡斯的回答似乎会奏效......只需要更多关于将所有东西放在哪里的细节。由于我对这一切都不熟悉,所以我需要一点时间才能弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多