我想使用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,也可能是我有控制器,視圖和路線設置的方式。
添加'alert'或'console.log'語句你'js.erb'文件來測試是否代碼裏面正在執行。 – elements
我已經嘗試用'alert'在那裏。什麼都沒有出現。當我發佈這個問題時,我刪除了'alert' –
爲什麼你要渲染html?我會刪除html響應,並讓rails默認爲js.erb。如果這樣,你需要使用js重定向,否則你在一次請求中調用render兩次,這是不允許的。 – Nathan