2015-08-31 34 views
0

我想使用Ajax替換圖像索引頁上的div標籤。現在,我有以下幾點:如何使用Ajax替換視圖中的div標籤

_sub.html.erb

<% @group.images.each do |image| %> 
     <%= image_tag image.pic.url(:medium) %> 
     <%= button_to '+1', image_upvote_path(image), remote: true, method: :post %> 
<% end %> 

index.html.erb

<div id="next_group"> 
    <%= render 'sub' %> 
</div> 

upvote.js.erb

$("#next_group").empty(); 
$("#next_group").append("<%= j render 'sub' %>"); 

在我images_controller

def index 
    @group = Group.offset(rand(Group.count)).first 
end 

def upvote 
    @image = Image.find(params[:image_id]) 
    @image.votes.create 

    respond_to do |format| 
     format.html { redirect_to groups_path } 
     format.js 
    end 
end 

而在我的路線,我有

image_upvote POST /images/:image_id/upvote(.:format) images#upvote 

我是怎麼回事的理解:

在我的索引頁我有一個div容器,呈現我希望用戶看到的子部分。在子部分內部,我有一個button_to助手,其中包含remote: true屬性(?)以及單擊該按鈕將啓動的路徑/操作。行動是images#upvote。因此,在圖像控制器中,我定義了點擊按鈕時會發生什麼(創建一個upvote),但我也說我希望它用Ajax響應,這是因爲我聲明瞭remote: true

這裏是我開始有點困惑。由於正在使用Ajax,軌道會自動查找upvote.js.erb文件,因爲它是發生的upvote操作?

我的問題現在是投票正在創建就好,但我不認爲在upvote.js.erb的JavaScript正在執行。該頁面將保留在正在顯示的當前@組中,而不會呈現新的_sub部分。所以我想我不確定是否有問題的JavaScript,也可能是我有控制器,視圖和路線設置的方式。

+0

添加'alert'或'console.log'語句你'js.erb'文件來測試是否代碼裏面正在執行。 – elements

+0

我已經嘗試用'alert'在那裏。什麼都沒有出現。當我發佈這個問題時,我刪除了'alert' –

+0

爲什麼你要渲染html?我會刪除html響應,並讓rails默認爲js.erb。如果這樣,你需要使用js重定向,否則你在一次請求中調用render兩次,這是不允許的。 – Nathan

回答

0

也許鍵無法屬於任何形式,嘗試使用link_to或添加remote選項路徑