2009-11-20 177 views
0

我是新來的rails,所以對我來說很容易。我已經構建了一個博客,並且正在嘗試向/posts/index.html.erb頁面添加「投票」類型功能。有點像Facebook的功能。我可以成功獲得投票表單的工作。我已經成功地通過<%@ posts.each do | post | %>呼叫。這是我遇到問題的地方。然後,我告訴索引,在上面還要爲每個帖子投票表單以及<%= post.votes.count%>來顯示每個帖子的總票數並允許爲每個帖子提交表單。我正在使用AJAX來允許這一切工作在一起。Ruby on Rails - AJAX - div問題

由於我的/votes/create.js.rjs工作方式,它會將結果發送到div id =「votes」,並在<%@ posts.each do | post | %>我在票div標記中包裝<%= post.votes.count%>。但是,當create.js.rjs發送數據時,它只會更新呈現的html頁面上的第一個div標籤。

所以,如果你可以想象,就像在Facebook上一樣,當你點擊你喜歡的東西時,更新不會發生在你剛剛點擊的帖子上,而是在另一篇帖子的第一篇文章的頁面頂部。投票計數是由您點擊的元素表示的,但在錯誤的記錄中。

下面是代碼:

帖子/ 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 %> 

回答

1

檢查實際呈現的html首先看看每個元素是否有唯一的ID。如果沒有(並且有多個具有相同ID的元素),JS將默認更新列表中的第一個元素。您將需要一些方法來唯一標識您要更新的元素。你總是可以做一個簡單的

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

,然後用

<%= f.hidden_field "vote-#{i}", :value => '1' %> 

標記每個元素,然後通過i到您的RJS所以它知道哪些領域它正在更新計數。

+0

這正是發生的情況。我想我可以帶領更多的導航幫助,以便將上述內容放在哪裏。例如,我是否要替換當前的<%@ posts.do each | post | %>與上面的代碼,或者我添加它下面?此外,是否必須更改/votes/create.js.rjs以表示「vote - #{i}」,以及正確的語法是什麼。最後,我是否需要向votes_controller.rb添加一些內容來傳遞此信息?我希望有這樣做。謝謝,如果可以的話,讓我知道上面的內容。 – bgadoci 2009-11-20 15:38:21

+0

正確,你會替換當前的<%@ posts.do each | post | %>。 正確,您需要檢查rjs以查找諸如「vote - #{i}(但先看下一段)」 正確,您需要將此內容傳遞給控制器​​,以傳遞給rjs 。 這可以通過在form_remote_for中添加一個:with => i或創建另一個隱藏字段來保存每個div的i值,然後它將與表單一起提交,您可以使用「vote - #{ params [:i]}「以得到值 – Lukas 2009-11-20 16:17:32

0

我不完全理解這個問題。你是說當你點擊投票時,它會在錯誤的帖子上更新計數?

假設是這樣的話,我認爲你的問題是你不能唯一標識你的html中的每個帖子。注意,這些divs等應該是類,這不是有效的HTML。無論如何,您希望每個帖子都有一個帶有唯一標識ID的div,例如post_1,post_2等,並且應該隨您的ajax請求一起發送,以便響應知道要更新哪個div。

這裏的一個提示與你的問題沒有關係,就是把整個循環放到一個局部區域中,並用下面的代碼進行渲染:collection。使更好的代碼。

+0

感謝您的提示。盧卡斯的答案似乎可以工作......只需要更多關於放置位置的更多詳細信息,因爲我對這一切都很陌生,我有點想弄明白。 – bgadoci 2009-11-20 16:04:21